nginx配置文件主要分為4部分:
main(全局設(shè)置)?? ?main部分設(shè)置的指令將影響其他所有設(shè)置
server(主機(jī)設(shè)置)server部分的指令主要用于指定主機(jī)和端口
upstream(負(fù)載均衡服務(wù)器設(shè)置)upstream指令主要用于負(fù)載均衡戈轿,設(shè)置后端服務(wù)器
location(URL匹配特定位置的設(shè)置)部分用于匹配網(wǎng)頁(yè)位置
這四者之間的關(guān)系:
server繼承main曼验,location繼承server,
upstream既不會(huì)繼承其他設(shè)置也不會(huì)被繼承
-------------------------------------------------------------------------------------------------------------------
#user是主模塊指令狠半,定義Nginx運(yùn)行的用戶和用戶組
user www www;
#worker——processes是主模塊指令宰翅,指定了nginx要開(kāi)啟的進(jìn)程數(shù)弃甥,每個(gè)nginx進(jìn)程平均耗費(fèi)10M-12M,
建議設(shè)置為等于CPU總核心數(shù)汁讼。
worker_processes 8;
#error_log是個(gè)主模塊指令淆攻,用來(lái)定義全局錯(cuò)誤日志文件,日志輸出級(jí)別有[ debug | info | notice | warn | error | crit ]可供選擇嘿架,其中debug輸出日志最為詳細(xì)瓶珊,而crit輸出日志最少。
error_log /var/log/nginx/error.log info;
#pid是主模塊指令耸彪,用來(lái)指定進(jìn)程id的存儲(chǔ)文件位置
pid /var/run/nginx.pid;
#一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目艰毒,理論值應(yīng)該是最多打開(kāi)文件數(shù)(系統(tǒng)的值ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請(qǐng)求并不均勻搜囱,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#events指令用來(lái)設(shè)定nginx工作模式與連接數(shù)上限
events
{
#use是個(gè)事件模塊指令柑土,用來(lái)指定nginx的工作模式蜀肘,nginx支持的工作模式有[ kqueue、rtsig稽屏、epoll扮宠、poll、select狐榔、 /dev/poll];select和poll都是標(biāo)準(zhǔn)的工作模式坛增,kqueue和epoll是高效的工作模式,不同的是epoll用在linux平臺(tái)上薄腻,而kqueue用在BSD系統(tǒng)中收捣,對(duì)于linux系統(tǒng),epoll工作模式時(shí)首選
use epoll;
#worker_connections事件模塊指令庵楷,用于定義nginx每個(gè)進(jìn)程的最大連接數(shù)罢艾,默認(rèn)是1024楣颠,最大客戶端連接數(shù)有worker_processes和worker_connections決定,即max_client=worker_processes*worker_connections,在作為反向代理是變?yōu)?max_clients=worker_processes*worker_connections/4咐蚯。進(jìn)程的最大連接數(shù)受linux系統(tǒng)的最大打開(kāi)文件數(shù)限制童漩,在執(zhí)行操作系統(tǒng)命令“ulimit -n 65535”后worker_connections的設(shè)置才能生效。
worker_connections 65535;
}
-------------------------------------------以上是全局配置-------------------------------------
#設(shè)定http服務(wù)器
http
{
include mime.types; #主模塊指令春锋,實(shí)現(xiàn)對(duì)配置文件所包含的文件設(shè)定矫膨,可以減少主配置文件的復(fù)雜度,類似apache中的include方法期奔。
default_type application/octet-stream; #屬于http核心模塊指令侧馅,這里默認(rèn)類型為二進(jìn)制流,也就是當(dāng)文件類型未定義是使用這種方式能庆,例如在沒(méi)有配置php環(huán)境時(shí)施禾,nginx是不予解析的,此時(shí)搁胆,用瀏覽器訪問(wèn)php文件就會(huì)出現(xiàn)下載窗口
#charset utf-8; #默認(rèn)編碼
server_names_hash_bucket_size 128; #服務(wù)器名字的hash表大小
proxy_headers_hash_max_size 51200; #設(shè)置頭部哈希表的最大值弥搞,不能小于你后端服務(wù)器設(shè)置的頭部總數(shù)
proxy_headers_hash_bucket_size 6400;#設(shè)置頭部哈希表大小
client_header_buffer_size 32k; #用于指定來(lái)自客戶端請(qǐng)求頭headerbuffer大小,對(duì)于大多數(shù)請(qǐng)求渠旁,1KB的緩沖區(qū)大小已經(jīng)足夠攀例,如果自定義了消息頭或有更大的cookie,可以增加緩沖區(qū)大小顾腊。這里設(shè)置為32KB
large_client_header_buffers 4 128k; #用來(lái)指定客戶端請(qǐng)求中較大的消息頭的緩存最大數(shù)量和大小粤铭,“4”為個(gè)數(shù),“128”為大小杂靶,最大緩存為4個(gè)128KB梆惯。
sendfile on; #開(kāi)啟高效文件傳輸模式,將tcp_nopush和tcp_nodely兩個(gè)指令設(shè)置為on吗垮,用于防止網(wǎng)絡(luò)阻塞垛吗。
autoindex on; #開(kāi)啟目錄列表訪問(wèn),合適下載服務(wù)器烁登,默認(rèn)關(guān)閉怯屉。
tcp_nopush on; #防止網(wǎng)絡(luò)阻塞
tcp_nodelay on; #防止網(wǎng)絡(luò)阻塞
keepalive_timeout 120; #用于設(shè)置客戶端連接保持活動(dòng)的超時(shí)時(shí)間,在超過(guò)這個(gè)時(shí)間之后服務(wù)器會(huì)關(guān)閉該鏈接饵沧。
client_header_timeout 3m锨络;
用于設(shè)置客戶端請(qǐng)求讀取超時(shí)時(shí)間,如果超過(guò)這個(gè)時(shí)間狼牺,客戶端沒(méi)有發(fā)送任何數(shù)據(jù)羡儿,nginx將返回“request time out (408)”錯(cuò)誤。
client_body_timeout 3m;用于設(shè)置客戶端請(qǐng)求主體讀取超時(shí)時(shí)間锁右,默認(rèn)值為60.如果超過(guò)這個(gè)時(shí)間失受,客戶端還沒(méi)有發(fā)送任何數(shù)據(jù)讶泰,nginx將返回“Request time out(408)”
server_tokens off; #修改或隱藏Nginx的版本號(hào)
client_body_buffer_size 256k;# 緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù)
send_timeout 3m; #服務(wù)器超時(shí)設(shè)置
#FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問(wèn)速度拂到。下面參數(shù)看字面意思都能理解痪署。
fastcgi_connect_timeout 300; 指定連接到后端fastCGI的超時(shí)時(shí)間
fastcgi_send_timeout 300;?? ?向fastCGI請(qǐng)求的超時(shí)時(shí)間,這個(gè)值是指已經(jīng)完成兩次握手后向fastCGI傳送的超時(shí)時(shí)間
fastcgi_read_timeout 300;?? ?接收f(shuō)astCGI應(yīng)答的超時(shí)時(shí)間兄旬,這個(gè)值已經(jīng)完成兩次握手后接收f(shuō)astCGI應(yīng)答的超時(shí)時(shí)間
fastcgi_buffer_size 64k;?? ?指定讀取fastCGI應(yīng)答第一部分需要用多大的緩沖區(qū)狼犯,一般第一部分應(yīng)答不會(huì)超過(guò)1k,一般設(shè)置為64k
fastcgi_buffers 4 64k;?? ??? ?指定本地需要用多少和多大的緩沖區(qū)來(lái)緩沖fastCGI的應(yīng)答
fastcgi_busy_buffers_size 128k;?? ?默認(rèn)值是fastcgi_buffers的兩倍
fastcgi_temp_file_write_size 128k;?? ?在寫(xiě)入fastcgi_temp_path是用多大的數(shù)據(jù)塊领铐,默認(rèn)值是fastcgi_buffers兩倍
#gzip模塊設(shè)置
gzip on; #開(kāi)啟gzip壓縮輸出
gzip_min_length 1k;
#用于設(shè)置允許壓縮的頁(yè)面最小字節(jié)數(shù)悯森,頁(yè)面字節(jié)數(shù)從header頭的content-length中獲取,默認(rèn)值是0绪撵,
不管頁(yè)面多大都進(jìn)行壓縮瓢姻,建議設(shè)置成大于1k的字節(jié)數(shù),小于1k可能會(huì)越壓越大最小壓縮文件大小
gzip_buffers 4 16k; #表示申請(qǐng)4個(gè)單位為16k的內(nèi)存作為壓縮結(jié)果流緩存音诈,默認(rèn)值是申請(qǐng)與原始數(shù)據(jù)大小相同的內(nèi)存空間來(lái)存儲(chǔ)gzip壓縮結(jié)果
gzip_http_version 1.0; #壓縮版本(默認(rèn)1.1幻碱,前端如果是squid2.5請(qǐng)使用1.0)
gzip_comp_level 2; #壓縮等級(jí)
gzip_types text/plain application/x-javascript text/css application/xml;
#壓縮類型,默認(rèn)就已經(jīng)包含text/html细溅,所以下面就不用再寫(xiě)了褥傍,寫(xiě)上去也不會(huì)有問(wèn)題,但是會(huì)有一個(gè)warn喇聊。
gzip_vary on;選項(xiàng)可讓前端的緩存服務(wù)器緩存經(jīng)過(guò)gzip壓縮的頁(yè)面恍风,例如,用squid緩存經(jīng)過(guò)nginx壓縮的數(shù)據(jù)誓篱。
#limit_zone crawler $binary_remote_addr 10m; #開(kāi)啟限制IP連接數(shù)的時(shí)候需要使用
----------------------------------以上是http模塊設(shè)置--------------------
upstream是nginx的http upstream模塊朋贬,這個(gè)模塊通過(guò)一個(gè)簡(jiǎn)單的調(diào)度算法來(lái)實(shí)現(xiàn)客戶端Ip到后端服務(wù)器的負(fù)載均衡,
下面的設(shè)置中窜骄,通過(guò)upstream指令指定一個(gè)負(fù)載均衡器的名稱為blog.123.com兄世,這個(gè)名稱可以任意指定,在后面需要用到的地方直接調(diào)用即可啊研。
upstream www.123.com {
server 192.168.12.25:80 weight=3;
server 192.168.12.22:80 weight=2;
server 192.168.12.92:80 weight=3;
}
nginx的負(fù)載均衡支持4種調(diào)度算法:
輪詢(默認(rèn))每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端某臺(tái)服務(wù)器宕機(jī)鸥拧,故障系統(tǒng)自動(dòng)剔除党远,使用戶訪問(wèn)不受影響,
weight? 指定輪詢權(quán)值富弦,weight值越大沟娱,分配到的訪問(wèn)幾率越高,主要用于后端每個(gè)服務(wù)器性能不均的情況下
ip_hash 每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配腕柜,這樣來(lái)自同一個(gè)ip的訪客固定訪問(wèn)一個(gè)后端服務(wù)器济似,有效解決動(dòng)態(tài)網(wǎng)頁(yè)
存在的session共享問(wèn)題
fair? 比上面連個(gè)更加智能的算法矫废,此種算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能的進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的
響應(yīng)時(shí)間來(lái)分配請(qǐng)求砰蠢,響應(yīng)時(shí)間短的優(yōu)先分配蓖扑,nginx本身是不支持fair的,如果需要使用這種調(diào)度算法台舱,必須下載nginx的upstream_fair模塊
url_hash 此方法按訪問(wèn)的url的hash結(jié)果來(lái)分配請(qǐng)求律杠,是每個(gè)url定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存
服務(wù)器的效率竞惋,nginx本身是不支持url_hash,如果需要使用這種調(diào)度算法柜去,必須安裝nginx的hash軟件包
在http upstream模塊中,可以通過(guò)server指令指定后端服務(wù)器的ip地址和端口拆宛,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在
負(fù)載均衡調(diào)度中的狀態(tài)嗓奢,常用的幾種狀態(tài)有:
down? 表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡
backup 預(yù)留的備份機(jī)器,當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候才會(huì)請(qǐng)求backup機(jī)器浑厚,因此這臺(tái)機(jī)器的壓力最輕
max_fails 允許請(qǐng)求失敗的次數(shù)股耽,默認(rèn)為1,當(dāng)超過(guò)最大次數(shù)時(shí)瞻颂,返回proxy_next_upstream模塊定義的錯(cuò)誤
fail_timeout 在經(jīng)歷了max_fails此失敗后豺谈,暫停服務(wù)的時(shí)間,max_fails可以和fail_timeout一起使用
--------------------------------以上是設(shè)定負(fù)載均衡的服務(wù)器列表--------------------------
#虛擬主機(jī)的配置
server
{
#listen指定虛擬主機(jī)服務(wù)器端口
listen 80;
#server_name用來(lái)指定ip地址或者域名贡这,多個(gè)域名之間用空格分開(kāi)
server_name www.ha97.com ha97.com;
#index用于設(shè)定訪問(wèn)的默認(rèn)首頁(yè)地址
index index.html index.htm index.php;
#root指令用于指定虛擬主機(jī)的網(wǎng)頁(yè)根目錄茬末,這個(gè)目錄可以是相對(duì)路徑,也可以使絕對(duì)路徑
root /data/www/ha97;
#charser用于設(shè)置網(wǎng)頁(yè)的默認(rèn)編碼格式
charest gb2312
#access_log用來(lái)指定此虛擬機(jī)的訪問(wèn)日志存放路徑
access_log /data/logs/nginx/goods.access.log;
#error_log 用來(lái)指定此虛擬機(jī)的錯(cuò)誤日志存放路徑
error_log /data/logs/nginx/goods.error.log;
--------------------------------------以上是server虛擬主機(jī)配置----------------------------
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#圖片緩存時(shí)間設(shè)置盖矫,expires用來(lái)指定過(guò)期時(shí)間
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS緩存時(shí)間設(shè)置丽惭,expires用來(lái)指定過(guò)期時(shí)間
location ~ .*\.(js|css)?$
{
expires 1h;
}
#日志格式設(shè)定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義本虛擬主機(jī)的訪問(wèn)日志
access_log /var/log/nginx/ha97access.log access;
#對(duì) "/" 啟用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服務(wù)器可以通過(guò)X-Forwarded-For獲取用戶真實(shí)IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可選辈双。
proxy_set_header Host $host;
client_max_body_size 10m; #允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)
client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù)责掏,
proxy_connect_timeout 90; #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
proxy_send_timeout 90; #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
proxy_read_timeout 90; #連接成功后,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
proxy_buffers 4 32k; #proxy_buffers緩沖區(qū)湃望,網(wǎng)頁(yè)平均在32k以下的設(shè)置
proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大谢怀摹(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#設(shè)定緩存文件夾大小,大于這個(gè)值证芭,將從upstream服務(wù)器傳
}
#設(shè)定查看Nginx狀態(tài)的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的內(nèi)容可以用apache提供的htpasswd工具來(lái)產(chǎn)生瞳浦。
}
#本地動(dòng)靜分離反向代理配置
#所有jsp的頁(yè)面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
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 http://127.0.0.1:8080;
}
#所有靜態(tài)文件由nginx直接讀取不經(jīng)過(guò)tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}
---------------------------------------------以上是url匹配設(shè)置-----------------------------------
例子:
配置文件信息
vi /usr/local/nginx/conf/nginx.conf
user? www www;
worker_processes? 1;
error_log? /cacti/nginx/logs/error.log;
#error_log? logs/error.log? notice;
#error_log? logs/error.log? info;
#pid??????? logs/nginx.pid;
events {
worker_connections? 1024;
}
http {
include?????? mime.types;
default_type? application/octet-stream;
server_names_hash_bucket_size 128;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
tcp_nopush???? on;
keepalive_timeout 300;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
server_tokens off;
client_body_buffer_size 256k;
send_timeout 3m;
client_header_timeout 3m;
client_body_timeout 3m;
proxy_ignore_client_abort on;
gzip on;
gzip_min_length? 1k;
gzip_buffers???? 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types?????? text/plain application/x-javascript text/css ap??????? plication/xml;
gzip_vary on;
include vhosts/*.conf;
}
vi /usr/local/nginx/conf/vhosts/upstream.conf
upstream test {
server 192.168.12.22:80;
server 192.168.12.25:80;
}
vi /usr/local/nginx/conf/vhosts/proxy.conf
server{
listen???????????? 80;
server_name? 192.168.12.22;
location / {
proxy_pass http://test/;
}
}
server{
listen???????????? 80;
server_name? 192.168.12.25;
location / {
proxy_pass http://test/;
}
}