網(wǎng)上整理的關(guān)于Nginx 學(xué)習(xí)材料 2
一 Nginx 簡(jiǎn)單的負(fù)載均衡配置示例[原創(chuàng)](鏈接地址:http://zyan.cc/post/306/)www.zyan.cc 和 blog.zyan.cc 域名均指向 Nginx 所在的服務(wù)器I
一 Nginx 簡(jiǎn)單的負(fù)載均衡配置示例[原創(chuàng)]
(鏈接地址:http://zyan.cc/post/306/)
www.zyan.cc 和 blog.zyan.cc 域名均指向 Nginx 所在的服務(wù)器IP 。
用戶訪問(wèn)http://www.zyan.cc,將其負(fù)載均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四臺(tái)服務(wù)器。
用戶訪問(wèn)http://blog.zyan.cc,將其負(fù)載均衡到192.168.1.7服務(wù)器的8080、8081、8082端口。
以下為配置文件nginx.conf :(windows 中配置參數(shù)有點(diǎn)不同,測(cè)試過(guò)的) user www www;
worker_processes 10;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#最大文件描述符
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
{
include conf/mime.types;
default_type application/octet-stream;
keepalive_timeout 120;
tcp_nodelay on;
upstream www.zyan.cc {
1 / 93
,server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
server 192.168.1.5:80;
}
upstream blog.zyan.cc {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}
server
{
listen 80;
server_name www.zyan.cc;
location / {
proxy_pass http://www.zyan.cc;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
log_format www_s135_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data1/logs/www.log www_s135_com;
}
server
{
listen 80;
server_name blog.zyan.cc;
location / {
2 / 93
,proxy_pass http://blog.zyan.cc;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
log_format blog_s135_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data1/logs/blog.log blog_s135_com;
}
}
附:Nginx 的安裝方法可參照《Nginx 0.5.31 PHP 5.2.4(FastCGI )搭建可承受3萬(wàn)以上并發(fā)連接數(shù),勝過(guò)Apache 10倍的Web 服務(wù)器》文章的以下段落(僅做負(fù)載均衡,無(wú)需支持PHP 的安裝方法):
二、安裝PHP 5.2.4(FastCGI 模式)
4、創(chuàng)建www 用戶和組,以及其使用的目錄:
三、安裝Nginx 0.5.31
1、安裝Nginx 所需的pcre 庫(kù):
2、安裝Nginx
3、創(chuàng)建Nginx 日志目錄
5、啟動(dòng)Nginx
問(wèn)答:
1. 如果負(fù)載均衡后面的機(jī)器都是要用到session 的話,如何很好的解決這個(gè)問(wèn)題呢?
2. 有沒(méi)有類似的負(fù)載均衡功能? 另外還有一個(gè)疑問(wèn):
客戶端直接訪問(wèn)web 服務(wù)器時(shí),可以用HTTP_CLIENT_IP、REMOTE_ADDR 這幾個(gè)變量看到客戶端的IP ,經(jīng)過(guò)squid 或者ngrnx 之后,還能看到客戶端的IP 嗎? 是不是要用HTTP_X_FORWARDED_FOR
—BIG-IP 就是用來(lái)做負(fù)載均衡的。經(jīng)過(guò)squid 或者ngrnx 之后,看到客戶端的IP ,請(qǐng)用HTTP_X_FORWARDED_FOR
3 / 93
,3.A. 如果均衡的域名中有泛域名,或有幾百個(gè)域名的話可以配置嗎?
B.ngnix 在做均衡的時(shí)候是否已經(jīng)包含了cache 功能?
C.ngnix---squid----apache 取的的HTTP_X_FORWARDED_FOR是squid 服務(wù)器的ip 地址,如果想取真實(shí)客戶端地址可以做到嗎?
回復(fù):(1)nginx.conf
server_name .s135.com; 即可支持***.s135.com泛域名
(2)nginx負(fù)載均衡只做反向代理,有簡(jiǎn)單的緩沖,但不像Squid 那樣將cache 存在本機(jī)。
(3)我已經(jīng)在nginx.conf 配置文件中增加:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
編譯squid 時(shí)加上--enable-follow-x-forwarded-for
然后在squid.conf 中輸入一行:
follow_x_forwarded_for allow all
后端的Apache 取日志(httpd.conf ):
LogFormat "{X-Forwarded-For}i l u t "r" >s b "{Referer}i" "{User-Agent}i" h T" combined
取到的就是用戶真實(shí)IP
4. 這個(gè)軟件是不錯(cuò),但是有一個(gè)硬傷,做負(fù)載均衡時(shí),好像無(wú)法檢測(cè)節(jié)點(diǎn)健康狀態(tài)?
5.follow_x_forwarded_for allow all 全開(kāi)是不是會(huì)引起安全問(wèn)題?
6. 請(qǐng)問(wèn),NGINX 是不是基于域名的負(fù)載均衡 能不能基于IP 做負(fù)載均衡
7. 請(qǐng)問(wèn):
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
4 / 93
,請(qǐng)問(wèn)這三個(gè)是什么意思啊?
8. 有請(qǐng)張兄指教:
server1與server2都安裝web.
為了省下一臺(tái)主機(jī). 在server1上安裝nginx, 做反向代理, 輪循到server1, server2的web 上實(shí)現(xiàn)負(fù)載均衡.
請(qǐng)問(wèn)這樣做與單獨(dú)使用一臺(tái)server3做負(fù)載均衡器的區(qū)別是不是非常大?
9. 我想問(wèn)下,轉(zhuǎn)發(fā)到后端那幾臺(tái)服務(wù)器,程序怎么同步?假如PHP 呢?做負(fù)載均衡時(shí),好像無(wú)法檢測(cè)節(jié)點(diǎn)健康狀態(tài)?想問(wèn)一下,為什么本機(jī)不能也接受訪問(wèn)呢? 例如:a 、b 、c 三臺(tái)機(jī)器,我在a 上面如同上面配置的,為什么訪問(wèn)總是在b 、c 來(lái)回?fù)Q,為什么a 上也有網(wǎng)站卻不被訪問(wèn)到呢?如果我也想訪問(wèn)a 服務(wù)器上的網(wǎng)站需要如何處理?
10. 誠(chéng)心請(qǐng)教,在php-fpm 模式下,
可以做一組
upstream blog.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}
負(fù)載均衡么?
我查閱了一些資料,好像php-fpm 同時(shí)只能打開(kāi)一個(gè)端口,如果想實(shí)現(xiàn)可行么?
11. 誠(chéng)心請(qǐng)教,在php-fpm 模式下,
可以做一組
upstream blog.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}
負(fù)載均衡么?
我查閱了一些資料,好像php-fpm 同時(shí)只能打開(kāi)一個(gè)端口,如果想實(shí)現(xiàn)可行么?
12.include conf/mime.types;
5 / 93
,引用mime.types 文件的路勁前面應(yīng)該不用加conf/,指定的類型文件應(yīng)該自動(dòng)會(huì)到conf 目錄中去找
13. 請(qǐng)教一下,經(jīng)過(guò)Nginx 轉(zhuǎn)發(fā)后,是不是會(huì)轉(zhuǎn)Http1.1損失為Http1.0?請(qǐng)教一下,經(jīng)過(guò)Nginx 轉(zhuǎn)發(fā)后,是不是會(huì)轉(zhuǎn)Http1.1損失為Http1.0?
14. 安裝php 必須要用fastcgi 模式嗎?我用的是fpm 的,但發(fā)現(xiàn)做負(fù)載均衡的時(shí)候發(fā)現(xiàn)訪問(wèn)/message/目錄下的php 文件的時(shí)候總是失效,系統(tǒng)自動(dòng)在/下面去訪問(wèn)了,不知是什么原因的?
解答:解決了, 剛開(kāi)始準(zhǔn)備將負(fù)載均衡器也做為web 使用, 啟用了以下代碼 ,將這幾行刪除即可。
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; include fastcgi_params;
}
6 / 93
,二 nginx upstream的分配方式
(鏈接地址:http://onlyzq.blog.51cto.com/1228/557848/)
1、輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down 掉,能自動(dòng)剔除。
2、weight
指定輪詢幾率,weight 和訪問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況。 例如:
upstream bakend {
server 192.168.159.10 weight=10;
server 192.168.159.11 weight=10;
}
3、ip_hash
每個(gè)請(qǐng)求按訪問(wèn)ip 的hash 結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session 的問(wèn)題。
例如:
upstream resinserver{
ip_hash;
server 192.168.159.10:8080;
server 192.168.159.11:8080;
}
4、fair (第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
upstream resinserver{
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按訪問(wèn)url 的hash 結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url 定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。
例:在upstream 中加入hash 語(yǔ)句,server 語(yǔ)句中不能寫(xiě)入weight 等其他的參數(shù),hash_method是使用的hash 算法
upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
7 / 93
,}
tips:
upstream resinserver{#定義負(fù)載均衡設(shè)備的Ip 及設(shè)備狀態(tài)
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}
在需要使用負(fù)載均衡的server 中增加
proxy_pass http://resinserver/;
每個(gè)設(shè)備的狀態(tài)設(shè)置為:
1.down 表示單前的server 暫時(shí)不參與負(fù)載
2.weight 默認(rèn)為1.weight 越大,負(fù)載的權(quán)重就越大。
3.max_fails :允許請(qǐng)求失敗的次數(shù)默認(rèn)為1. 當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤
4.fail_timeout:max_fails次失敗后,暫停的時(shí)間。
5.backup : 其它所有的非backup 機(jī)器down 或者忙的時(shí)候,請(qǐng)求backup 機(jī)器。所以這臺(tái)機(jī)器壓力會(huì)最輕。
nginx 支持同時(shí)設(shè)置多組的負(fù)載均衡,用來(lái)給不用的server 來(lái)使用。
client_body_in_file_only 設(shè)置為On 可以講client post過(guò)來(lái)的數(shù)據(jù)記錄到文件中用來(lái)做debug client_body_temp_path 設(shè)置記錄文件的目錄 可以設(shè)置最多3層目錄
location 對(duì)URL 進(jìn)行匹配. 可以進(jìn)行重定向或者進(jìn)行新的代理 負(fù)載均衡
8 / 93
,三 關(guān)于Nginx 的server_name
(鏈接地址:http://onlyzq.blog.51cto.com/1228/535279)
Nginx 中的server_name指令主要用于配置基于名稱的虛擬主機(jī),server_name指令在接到請(qǐng)求后的匹配順序分別為:
1、準(zhǔn)確的server_name匹配,例如:
server {
listen 80;
server_name domain.com www.domain.com;
...
}
2、以*通配符開(kāi)始的字符串:
server {
listen 80;
server_name *.domain.com;
...
}
3、以*通配符結(jié)束的字符串:
server {
listen 80;
server_name www.*;
...
}
4、匹配正則表達(dá)式:
server {
listen 80;
9 / 93
,server_name ~^(?. ).domain.com$;
...
}
nginx 將按照1,2,3,4的順序?qū)erver name 進(jìn)行匹配,只有有一項(xiàng)匹配以后就會(huì)停止搜索,所以我們?cè)谑褂眠@個(gè)指令的時(shí)候一定要分清楚它的匹配順序(類似于location 指令)。
server_name指令一項(xiàng)很實(shí)用的功能便是可以在使用正則表達(dá)式的捕獲功能,這樣可以盡量精簡(jiǎn)配置文件,畢竟太長(zhǎng)的配置文件日常維護(hù)也很不方便。下面是2個(gè)具體的應(yīng)用:
1、在一個(gè)server 塊中配置多個(gè)站點(diǎn):
server
{
listen 80;
server_name ~^(www.)?(. )$;
index index.php index.html;
root /data/wwwsite/$2;
}
站點(diǎn)的主目錄應(yīng)該類似于這樣的結(jié)構(gòu):
/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com
這樣就可以只使用一個(gè)server 塊來(lái)完成多個(gè)站點(diǎn)的配置。
2、在一個(gè)server 塊中為一個(gè)站點(diǎn)配置多個(gè)二級(jí)域名。
實(shí)際網(wǎng)站目錄結(jié)構(gòu)中我們通常會(huì)為站點(diǎn)的二級(jí)域名獨(dú)立創(chuàng)建一個(gè)目錄,同樣我們
10 / 93