一、安裝
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
二、配置
Nginx的反向代理功能,其實就是一個upstream模塊加一段主機SERVER定義。
三、upstream模塊詳解
Nginx的負載均衡功能主要由upstream模塊來完成,完整模塊名爲ngx_http_upstream_module。Nginx支持的代理方式有3種,PHP使用fastcgi_pass,反向代理使用proxy_pass。
1. proxy_pass
2. fastcgi_pass
3. memcached_pass
重要參數:
proxy_next_upstream
fastcgi_next_upstream
memcached_next_upstream
請求失敗時不給用戶返回錯誤信息,而是請求下一臺機器,用戶體驗很好!需要配合max_fails=1參數使用,並且只能是1.
四、調度算法相關
1、ip_hash參數的缺點:
1. 根據來源IP來做哈希算法,但是國內所有的單位都是通過NAT上網,多臺機器只有一個IP。
2. 必須是最前端的服務器,如果前端還有LVS負載均衡就無法實現。
3. 使用ip_hash的時候,權重weight和備份backup都不能用!
LVS裏面可以通過-P選項來實現同樣的功能,KeepAlived裏面也可以通過persistence_timeout 50參數來實現。
2、fair算法
根據頁面大小和相應時間來智能調度。第三方的算法,需要下載nginx的upstream_fair模塊。
缺點是也會導致負載不均。
3、URL算法
根據不同的URL調度到不同的服務器,最有利於緩存服務器,常見於CDN公司,也是第三方算法,需要下載模塊。
4、最小連接數least_conn
顧名思義
五、location指令詳解
語法:
location [ = | ~ | ~* | ^~ ] {
...................
}
= 精確匹配(優先級最高)
~ 區分大小寫
^~只區分字符串,不匹配正則
~*不區分大小寫
六、Nginx的http proxy模塊詳解
重要參數:
proxy_set_header Host $host: 增加主機名!主要用於後端服務器存在多個主機的場景。
proxy_set_header X-Forwarded-For $remote_addr :
如果後端服務器需要取得用戶IP,從header取得,使用 $remote_addr 變量建議修改日誌格式以顯示訪問用戶的IP!
七、NginxProxy根據URI實現轉發(實現動靜分離的重要方法,也是落伍論壇服務器的優化方法)
落伍論壇的服務器爲單臺,前端Nginx處理靜態請求,PHP拋給後端APACHE。
系統架構爲Linux+Nginx+Apache+MySQL。
實例:根據user_agent實現手機訪問轉發
語法:
location / {
if ($http_user_agent ~* "android")
{
proxy_pass http://android;
}
if ($http_user_agent ~* "iphone")
{
proxy_pass http://iphone;
}
proxy_pass http://backend;
}
公司使用nginx作爲負載均衡,有時候需要自定義header頭髮送給後端的真實服務器. 想過去應該是非常的簡單的事情.
例子如下:
設置代理服務器ip頭
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
然後自己在自定義個header,remote_header_test,如下:
proxy_set_header remote_header_test "123123123";
接着後端真實服務器打開www.ttlsa.com/nginx_header.php
源代碼是簡單的phpinfo
<?php
phpinfo();
?>
在phpinfo結果頁面中搜索剛纔設置的頭部,發現沒有找到,網上查找資料,才發現原來nginx會忽略掉下劃線的頭部變量.於是改成如下:
proxy_set_header remoteheadertest "123123123";
再次打開www.ttlsa.com/nginx_header.php,搜索remoteheadertest,有內容. 看來果真不能用下劃線. 然後改成'-',如下:
proxy_set_header remote-header-test "123123123";
打開頁面,搜索到的頭部是remote_header_test. 自動轉換成下劃線了.
如果想要支持下劃線的話,需要增加如下配置:
underscores_in_headers on;
可以加到http或者server中
語法:underscores_in_headers on|off
默認值:off
使用字段:http, server
是否允許在header的字段中帶下劃線