使用Nginx反向代理实现内网域名转发:详细配置指南
作者:本站 来源:本站
2026-03-15 09:16 1046阅读
场景描述
公司内网中有多台服务器的HTTP服务需要对外网静态IP进行映射时,如果仅依靠路由器的端口映射功能,只能将一台内网服务器的80端口映射到外网的80端口,其他服务器只能使用非80端口。这样访问时需要在域名后添加端口号,操作不便。同时,路由器最多只能设置20个端口映射,未来难以满足需求。
为此,内网搭建了一个Nginx反向代理服务器,将其80端口映射到外网IP的80端口。这样所有指向公司外网IP的域名请求都会发送到该反向代理服务器,再由Nginx根据不同的域名将请求转发至内网不同机器的对应端口,实现“依据域名自动转发”,而路由器只能做到“依据端口转发”。这一方案极大提升了灵活性。
涉及技术:Nginx编译安装、反向代理基本配置、路由器端口映射以及域名相关基础知识。
本次实验目标:在浏览器中输入 xxx123.tk 即可访问内网 192.168.10.38 的3000端口;输入 xxx456.tk 即可访问内网 192.168.10.40 的80端口。
配置步骤
服务器系统:Ubuntu 12.04
### 更新软件仓库
apt-get update -y
apt-get install wget -y# 下载Nginx及相关软件包
pcre用于编译rewrite模块,zlib支持gzip功能。此处使用的Nginx版本较旧(1.4.2),可安装新版。
cd /usr/local/src
wget <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz</a>
wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
tar xf pcre-8.33.tar.gz
tar xf zlib-1.2.8.tar.gz# 安装编译环境
apt-get install build-essential libtool -y# 创建Nginx运行用户(非特权用户)
useradd -s /bin/false -r -M -d /nonexistent www# 开始编译安装
/configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
--with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
make
make install# 授权目录
chown -R www:www /usr/local/nginx# 修改Nginx主配置文件
user www www;
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
include /usr/local/nginx/conf/reverse-proxy.conf;
sendfile on;
keepalive_timeout 65;
gzip on;
client_max_body_size 50m; # 代理缓冲用户请求的最大字节数
client_body_buffer_size 256k;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
proxy_connect_timeout 300s; # 与后端服务器连接超时
proxy_read_timeout 300s; # 后端服务器响应超时
proxy_send_timeout 300s;
proxy_buffer_size 64k; # 代理保存用户头信息的缓冲区大小
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_ignore_client_abort on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}编辑反向代理配置文件:
server {
listen 80;
server_name xxx123.tk;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.10.38:3000;
}
access_log logs/xxx123.tk_access.log;
}
server
{
listen 80;
server_name xxx456.tk;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.10.40:80;
}
access_log logs/xxx456.tk_access.log;
}重新加载Nginx配置使其生效,并将域名 xxx123.tk 解析到公司静态IP。此时,访问 xxx123.tk 即可到达内网 192.168.10.38:3000,访问 xxx456.tk 到达 192.168.10.40:80。
若需实现后端负载均衡,可使用 upstream 模块,如下配置将 nagios.xxx123.tk 请求分发给内网 192.168.0.131 和 192.168.0.132 两台机器:
upstream monitor_server {
server 192.168.0.131:80;
server 192.168.0.132:80;
}
server {
listen 80;
server_name nagios.xxx123.tk;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://monitor_server;
}
access_log logs/nagios.xxx123.tk_access.log;
}由于所有HTTP请求最终由反向代理服务器发起,后端服务器的访问日志中记录的IP是代理服务器的IP。若要记录真实客户端IP,需要调整后端日志格式。假设后端也是Nginx,配置如下:
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $HTTP_X_Forwarded_For';
access_log logs/access.log access;对比默认日志格式(使用 $remote_addr),可见差异。
遇到的问题
通过实验将 proxy_read_timeout 设为1ms后每次访问均出现504,确认是后端响应超时所致。增加如下配置后问题解决:
proxy_connect_timeout 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_ignore_client_abort on;
上一篇
下一篇
相关阅读