Nginx服务器作反向代理实现内部局域网的url转发配置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Nginx服务器作反向代理实现内部局域⽹的url转发配置
情景
由于公司内⽹有多台服务器的http服务要映射到公司外⽹静态IP,如果⽤路由的端⼝映射来做,就只能⼀台内⽹服务器的80端⼝映射到外⽹80端⼝,其他服务器的80端⼝只能映射到外⽹的⾮80端⼝。
⾮80端⼝的映射在访问的时候要域名加上端⼝,⽐较⿇烦。
并且公司
⼊⼝路由最多只能做20个端⼝映射。
肯定以后不够⽤。
然后k兄就提议可以在内⽹搭建个nginx反向代理服务器,将nginx反向代理服务器的80映射到外⽹IP的80,这样指向到公司外⽹IP的域
名的HTTP请求就会发送到nginx反向代理服务器,利⽤nginx反向代理将不同域名的请求转发给内⽹不同机器的端⼝,就起到了“根据域名⾃动转发到相应服务器的特定端⼝”的效果,⽽路由器的端⼝映射做到的只是“根据不同端⼝⾃动转发到相应服务器的特定端⼝”,真是喜⼤普奔啊。
涉及的知识:nginx编译安装,nginx反向代理基本配置,路由端⼝映射知识,还有⽹络域名等常识。
本次实验⽬标是做到:在浏览器中输⼊能访问到内⽹机器192.168.10.38的3000端⼝,输⼊能访问到内⽹机器192.168.10.40的80端⼝。
配置步骤
服务器ubuntu 12.04
###更新仓库
apt-get update -y
apt-get install wget -y
#下载nginx和相关软件包
pcre是为了编译rewrite模块,zlib是为了⽀持gzip功能。
额,这⾥nginx版本有点旧,因为我还要做升级nginx的实验⽤。
⼤家可以装新
版本。
cd /usr/local/src
wget <a href="ftp:///pub/software/programming/pcre/pcre-8.33.tar.gz">ftp:///pub/software/programming/pcre/pcre-8.33.tar.gz</a> wget <a href="/zlib-1.2.8.tar.gz">/zlib-1.2.8.tar.gz</a>
wget <a href="/download/nginx-1.4.2.tar.gz">/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⽤户
所谓的unprivileged user
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
#修改配置⽂件
vim nginx.conf
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; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_send_timeout 300s;
proxy_buffer_size 64k; #设置代理服务器(nginx)保存⽤户头信息的缓冲区⼤⼩
proxy_buffers 4 32k; #proxy_buffers缓冲区,⽹页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #⾼负荷下缓冲⼤⼩(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存⽂件夹⼤⼩,⼤于这个值,将从upstream服务器传递请求,⽽不缓冲到磁盘
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;
}
}
}
编辑反向代理服务器配置⽂件:
vim /usr/local/nginx/conf/reverse-proxy.conf
server
{
listen 80;
server_name ;
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/_access.log;
}
server
{
listen 80;
server_name ;
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/_access.log;
}
然后重新加载nginx配置⽂件,使之修改⽣效,再把域名指向公司静态IP,这样就成功的做到了在浏览器中输⼊的时候访问的内⽹服务器192.168.10.38的3000端⼝,输⼊访问192.168.10.40的80端⼝的作⽤。
如果想对后端机器做负载均衡,像下⾯这配置就可以把对的请求分发给内⽹的131和132这两台机器做负载均衡了。
upstream monitor_server {
server 192.168.0.131:80;
server 192.168.0.132:80;
}
server
{
listen 80;
server_name ;
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/_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;
再看看原来⽇志的格式长什么样:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
看出区别了吧
遇到的问题
之前没配置下⾯这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
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;
报错⽇志:
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后⾯的省略)
从⽇志看来是连接超时了,⽹上⼀通乱查之后估计可能是后端服务器响应超时了,本着⼤胆假设,⼩⼼求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设⼩(⽐如1ms)看会不会次次出现504。
后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。
于是把这个参数调⼤,加⼊上⾯那段配置,解决问题了。
PS:关于域名转发。