來自: http://storysky.blog.51cto.com/628458/486338/nginx
前幾天搭了一個論壇服務器並放到了公司的局域網裏面,論壇用的是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/;
}
}日誌
而後再訪問 bbs.xxx.com 後面的端口號就不在了,註冊、登陸、發帖都正常,但是不一下子又出問題了,用戶反映論壇沒法註冊,提示說「單一ip一天內只能註冊5次」,這是怎麼回事,經過檢查日誌後發現 全部公網發過來的請求居然都是 網關的ip地址 ,這下我明白了簡單的加了proxy之後若是不進一步設置的話 nginx是不會去判斷真正的客戶端ip的,而是直接把路由的地址做爲請求ip,因此會出現上述狀況,分析後查了下 nginx的wiki 因而就在上面又加了幾條:server
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/;
}
}blog
改完之後 reload 了一下nginx,發現日誌裏面的源ip已是真實的客戶端地址了,從新註冊,登陸,發帖,都正常,重複了屢次後沒有發現問題,客戶那裏也都正常了。ip
感謝爲我提供熱情幫助的三門板牙。路由
下面是從網上找的一篇文章,分析的很詳細 http://www.beijus.info/?p=730&cpage=1 ,同時也感謝這篇文章的做者 「蛋蛋面」rem