Nginx服务器作反向代理实现内部局域⽹的url转发配置
情景
由于公司内⽹有多台服务器的http服务要映射到公司外⽹静态IP,如果⽤路由的端⼝映射来做,就只能⼀台内⽹服务器的80端⼝映射到外⽹80端⼝,其他服务器的80端⼝只能映射到外⽹的⾮80端⼝。⾮80端⼝的映射在访问的时候要域名加上端⼝,⽐较⿇烦。并且公司
⼊⼝路由最多只能做20个端⼝映射。肯定以后不够⽤。
然后k兄就提议可以在内⽹搭建个nginx反向代理服务器,将nginx反向代理服务器的80映射到外⽹IP的80,这样指向到公司外⽹IP的域
名的HTTP请求就会发送到nginx反向代理服务器,利⽤nginx反向代理将不同域名的请求转发给内⽹不同机器的端⼝,就起到了“根据域名⾃动转发到相应服务器的特定端⼝”的效果,⽽路由器的端⼝映射做到的只是“根据不同端⼝⾃动转发到相应服务器的特定端⼝”,真是喜⼤普奔啊。
涉及的知识: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版本有点旧,因为我还要做升级nginx的实验⽤。⼤家可以装新
版本。
cd /usr/local/src
wget <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.</a> wget <a hre
f="zlib/zlib-1.2.">zlib/zlib-1.2.</a>
wget <a href="/download/nginx-1.4.">/download/nginx-1.4.</a>
tar xf pcre-8.
tar xf zlib-1.2.
#安装编译环境
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
#修改配置⽂件
f
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 {
pes;
default_type application/octet-stream;
include /usr/local/nginx/f;
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/f
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 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 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端⼝的作⽤。
如果想对后端机器做负载均衡,像下⾯这配置就可以把对123.tk的请求分发给内⽹的131和132这两台机器做负载均衡了。upstream monitor_server {
server 192.168.0.131:80;
server 192.168.0.132:80;
}
server
{
listen 80;
server_123.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 monitor_server;
}
access_log 123.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;
再看看原来⽇志的格式长什么样:
#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:关于域名转发
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论