http://storysky.blog.51cto.com/628458/486338nginx
前几天搭了一个论坛服务器并放到了公司的局域网里面,论坛用的是9066端口并在路由器上面作了个端口转发,并且把bbs.xxx.com这个域名也指向了公司的公网IP,由于想让用户在访问的时候不用输入端口号因而就想在公司的web服务器上面作个跳转,将访问bbs.xxx.com的请求都转到他的服务器上面去。我第一个想法就是 用 nginx的rewrite,过程很简单 配置以下:web
server {
listen 80;
server_name bbs.xxx.com;
rewrite "^/(.*)$" http://bbs.xxx.com:9066/$1 break;
}浏览器
因而访问bbs.xxx.com检查了一下,注册,登陆发帖等等操做都正常,本觉得这样就ok了,结果随后问题出现了,虽然能正常的跳转可是 用户浏览器的域名栏上的地址后面一直跟着 9066 这个端口号,这让领导很不满意,因而我找了下nginx的文档和在qq群问了下别的朋友,没有什么好办法。因而就改用了 proxy_pass,这个配置也很简单:服务器
server {
listen 80;
server_name bbs.xxx.com;
location /
{
proxy_pass http://bbs.xxx.com:9066/;
}
}ide
而后再访问 bbs.xxx.com 后面的端口号就不在了,注册、登陆、发帖都正常,但是不一下子又出问题了,用户反映论坛没法注册,提示说“单一ip一天内只能注册5次”,这是怎么回事,经过检查日志后发现 全部公网发过来的请求居然都是 网关的ip地址 ,这下我明白了简单的加了proxy之后若是不进一步设置的话 nginx是不会去判断真正的客户端ip的,而是直接把路由的地址做为请求ip,因此会出现上述状况,分析后查了下 nginx的wiki 因而就在上面又加了几条:spa
server {
listen 80;
server_name bbs.xxx.com;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://bbs.xxx.com:9066/;
}
}日志
改完之后 reload 了一下nginx,发现日志里面的源ip已是真实的客户端地址了,从新注册,登陆,发帖,都正常,重复了屡次后没有发现问题,客户那里也都正常了。server