本章要點
- Nginx 配置文件結(jié)構(gòu)
- 各個模塊的詳解
2.1 Nginx配置文件結(jié)構(gòu)
Nginx的配置文件nginx.conf位于其安裝目錄的conf目錄下。
nginx.conf由多個塊組成,最外面的塊是main雁歌,main包含Events和HTTP儿奶,HTTP包含upstream和多個Server眷射,Server又包含多個location镇辉,如圖:
main(全局設(shè)置)词身、server(主機(jī)設(shè)置)厅目、upstream(負(fù)載均衡服務(wù)器設(shè)置)和 location(URL匹配特定位置的設(shè)置)。
● main塊設(shè)置的指令將影響其他所有設(shè)置法严;
● server塊的指令主要用于指定主機(jī)和端口损敷;
● upstream指令主要用于負(fù)載均衡,設(shè)置一系列的后端服務(wù)器深啤;
● location塊用于匹配網(wǎng)頁位置拗馒。
這四者之間的關(guān)系式:server繼承main,location繼承server溯街,upstream既不會繼承其他設(shè)置也不會被繼承诱桂。
在這四個部分當(dāng)中,每個部分都包含若干指令呈昔,這些指令主要包含Nginx的主模塊指令挥等、事件模塊指令、HTTP核心模塊指令堤尾,同時每個部分還可以使用其他HTTP模塊指令肝劲,例如Http SSL模塊、HttpGzip Static模塊和Http Addition模塊等郭宝。
上面提到過nginx配置文件中主要包括六塊:main辞槐,events,http剩蟀,server,location切威,upstream
main塊:主要控制nginx子進(jìn)程的所屬用戶/用戶組育特、派生子進(jìn)程數(shù)、錯誤日志位置/級別先朦、pid位置缰冤、子進(jìn)程優(yōu)先級、進(jìn)程對應(yīng)cpu喳魏、進(jìn)程能夠打開的文件描述符數(shù)目等
events塊:控制nginx處理連接的方式
http塊:是nginx處理http請求的主要配置模塊棉浸,大多數(shù)配置都在這里面進(jìn)行
server塊:是nginx中主機(jī)的配置塊,可以配置多個虛擬主機(jī)
location塊:是server中對應(yīng)的目錄級別的控制塊刺彩,可以有多個
upstream塊:是nginx做反向代理和負(fù)載均衡的配置塊迷郑,可以有多個
2.2 各個模塊詳解
下面復(fù)制一下最原始配置文件ngin.conf中的內(nèi)容:
#user nobody;
worker_processes 1;
#error_log 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;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
2.2.1 main 模塊
- user zhaosc zhaoscgroup;:nginx的用戶枝恋,用戶組
- worker_processes 1; #啟動進(jìn)程數(shù),根據(jù)硬件調(diào)整嗡害,通常等于CPU數(shù)量或者2倍于CPU焚碌。
- worker_cpu_affinity 00000001 00000010 00000100 00001000; #CPU邏輯數(shù),為每個進(jìn)程分別綁在CPU上面霸妹,為每個進(jìn)程分配一個CPU十电。
注釋:它用的是二進(jìn)制表示,0001表示啟用第一個CPU內(nèi)核叹螟,0010表示啟用第二個CPU內(nèi)核鹃骂,依此類推;worker_processes最多開啟8個罢绽,8個以上性能提升不會再提升了畏线,而且穩(wěn)定性變得更低,所以8個進(jìn)程夠用了有缆。 - worker_rlimit_nofile 102400; #這個指令當(dāng)一個進(jìn)程打開的最大文件數(shù)目象踊,與NGINX并發(fā)連接有關(guān)系
- error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;#錯誤日志:存放路徑,[ debug | info | notice | warn | error | crit ] 棚壁,默認(rèn)值是error - pid logs/nginx.pid; #pid(進(jìn)程標(biāo)識符):存放路徑
2.2.2 events模塊
- use epoll; #多路復(fù)用IO 基于LINUX2.6以上內(nèi)核杯矩,可以大大提高NGINX的性能,可選值有:use [ kqueue | rtsig | epoll | /dev/poll | select | poll | eventport ]
- worker_connections 2000;#工作進(jìn)程的最大連接數(shù)量 理論上每臺nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections worker_processes為我們再main中開啟的進(jìn)程數(shù)
- client_header_buffer_size 4k;客戶端請求頭部的緩沖區(qū)大小袖外,這個可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置史隆,一般一個請求頭的大小不會超過1k,不過由于一般系統(tǒng)分頁都要大于1k曼验,所以這里設(shè)置為系統(tǒng)分頁大小泌射。查看系統(tǒng)分頁可以使用 getconf PAGESIZ。在這里容量4K鬓照,如果header頭信息請求超過了熔酷,nginx會直接返回400錯誤,先根據(jù)client_header_buffer_size配置的值分配一個buffer豺裆,如果分配的buffer無法容納 request_line/request_header拒秘,那么就會再次根據(jù)large_client_header_buffers配置的參數(shù)分配large_buffer,如果large_buffer還是無法容納臭猜,那么就會返回414(處理request_line)/400(處理request_header)錯誤躺酒。
- open_file_cache max=2000 inactive=60s;
為打開文件指定緩存,默認(rèn)是沒有啟用的蔑歌,max指定緩存最大數(shù)量羹应,建議和打開文件數(shù)一致,inactive是指經(jīng)過多長時間文件沒被請求后刪除緩存 打開文件最大數(shù)量為我們再main配置的worker_rlimit_nofile參數(shù) - open_file_cache_valid 60s;這個是指多長時間檢查一次緩存的有效信息次屠。如果有一個文件在inactive時間內(nèi)一次沒被使用园匹,它將被移除
- open_file_cache_min_uses 1;open_file_cache指令中的inactive參數(shù)時間內(nèi)文件的最少使用次數(shù)雳刺,如果超過這個數(shù)字,文件描述符一直是在緩存中打開的偎肃,如果有一個文件在inactive時間內(nèi)一次沒被使用煞烫,它將被移除。
- accept_mutex語法:accept_mutex [ on | off ] 默認(rèn)值:on Nginx使用連接互斥鎖進(jìn)行順序的accept()系統(tǒng)調(diào)用
- accept_mutex_delay 語法:accept_mutex_delay Nms; 默認(rèn)值:500ms 如果一個進(jìn)程沒有互斥鎖累颂,它將至少在這個值的時間后被回收
2.2.3 http模塊
include mime.types;#引用mime.types,這個類型定義了很多滞详,當(dāng)web服務(wù)器收到靜態(tài)的資源文件請求時,依據(jù)請求文件的后綴名在服務(wù)器的MIME配置文件中找到對應(yīng)的MIME Type紊馏,根據(jù)MIMETYPE設(shè)置并response響應(yīng)類型(Content-type)料饥,指定默認(rèn)類型為二進(jìn)制流,也就是當(dāng)文件類型未定義時使用這種方式朱监,此時岸啡,用瀏覽器訪問JSP文件就會出現(xiàn)下載窗口
default_type application/octet-stream;#定義的數(shù)據(jù)流,有的時候默認(rèn)類型可以指定為text,這跟我們的網(wǎng)頁發(fā)布還是資源下載是有關(guān)系的
fastcgi_intercept_errors on; #表示接收fastcgi輸出的http1.0 response code
server_names_hash_bucket_size 128; #保存服務(wù)器名字的hash表 #could not build the server_names_hash, you should increase server_names_hash_bucket_size: 64
client_header_buffer_size 4k;#用來緩存請求頭信息的赫编,容量4K
large_client_header_buffers 4 32k;巡蘸,如果header頭信息請求超過了,nginx會直接返回400錯誤擂送,先根據(jù)client_header_buffer_size配置的值分配一個buffer悦荒,如果分配的buffer無法容納request_line/request_header,那么就會再次根據(jù)large_client_header_buffers配置的參數(shù)分配large_buffer嘹吨,如果large_buffer還是無法容納搬味,那么就會返回414(處理request_line)/400(處理request_header)錯誤。
client_max_body_size 300m; #允許客戶端請求的最大單文件字節(jié)數(shù)
sendfile on; #指定NGINX是否調(diào)用這個函數(shù)來輸出文件蟀拷,對于普通的文件我們必須設(shè)置為ON碰纬,如果NGINX專門做為一個下載端的話可以關(guān)掉,好處是降低磁盤與網(wǎng)絡(luò)的IO處理數(shù)及系統(tǒng)的UPTIME
autoindex on;開啟目錄列表訪問问芬,適合下載服務(wù)器
tcp_nopush on; #防止網(wǎng)絡(luò)阻塞
keepalive_timeout 60;#非常重要悦析,根據(jù)實際情況設(shè)置值,超時時間此衅,客戶端到服務(wù)端的連接持續(xù)有效時間强戴,60秒內(nèi)可避免重新建立連接,時間也不能設(shè)太長炕柔,太長的話酌泰,若請求數(shù)10000媒佣,都占用連接會把服務(wù)托死
tcp_nodelay on;#提高數(shù)據(jù)的實時響應(yīng)性
client_body_buffer_size 512k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù)(請求多)
proxy_connect_timeout 5; #nginx跟后端服務(wù)器連接超時時間(代理連接超時)
proxy_read_timeout 60; #連接成功后匕累,后端服務(wù)器響應(yīng)時間(代理接收超時)
proxy_send_timeout 5; #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時)
proxy_buffer_size 16k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
proxy_buffers 4 64k;#proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話默伍,這樣設(shè)置
proxy_busy_buffers_size 128k; #高負(fù)荷下緩沖大小
proxy_temp_file_write_size 128k; #設(shè)定緩存文件夾大小欢嘿,大于這個值衰琐,將從upstream服務(wù)器傳
gzip on; #NGINX可以壓縮靜態(tài)資源,比例我的靜態(tài)資源有10M炼蹦,壓縮后只有2M羡宙,那么瀏覽器下載的就少了
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;#壓縮級別大小,最小1掐隐,最大9狗热,值越小,壓縮后比例越小虑省,CPU處理更快匿刮,為1時,原10M壓縮完后8M探颈,但設(shè)為9時熟丸,壓縮完可能只有2M了
gzip_types text/plain application/x-javascript text/css application/xml; 壓縮類型:text,js css xml 都會被壓縮
gzip_vary on; #作用是在http響應(yīng)中增加一行目的是改變反向代理服務(wù)器的緩存策略
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
日志格式 "$request" ' #ip 遠(yuǎn)程用戶 當(dāng)?shù)貢r間 請求URL
'$status $body_bytes_sent "$http_referer" ' #狀態(tài) 發(fā)送的大小 響應(yīng)的頭
'"$http_user_agent" $request_time'; #客戶端使用的
2.2.4 server模塊
- listen :所監(jiān)聽的端口
- server_name 配置訪問域名,可以有多個直接用空格隔開伪节,也可以用正則表達(dá)式
- charset:編碼集
- access_log :正常訪問日志所在的目錄
2.2.5 upatream 模塊
upstream 比較簡單,用于處理服務(wù)器的負(fù)載均衡光羞,實例如下:
先配置upstream 模塊
upstream zhaosc {
server 192.168.1.100:8080;
server 192.168.1.200:8080;
}
然后,配置location,將 proxy_pass配置為:http:// + upstream名稱
location / {
root html;
index index.html index.htm;
proxy_pass http://zhaosc;
}
nginx 負(fù)載均衡的算法是輪詢怀大,同時還支持權(quán)重(weight)機(jī)制纱兑,如下:
upstream zhaosc{
server 192.168.1.100:8080 weight=5;
server 192.168.1.200:8080 weight=10;
}
ip_hash如下:
upstream zhaosc{
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.200:8080;
}
fair: 按后端服務(wù)器的響應(yīng)時間來分配請求。響應(yīng)時間短的優(yōu)先分配叉寂。
與weight分配策略相似萍启。
upstream zhaosc{
server 192.168.1.100:8080;
server 192.168.1.200:8080;
fair;
}
url_hash:按訪問url的hash結(jié)果來分配請求,使每一個url定向到同一個后端服務(wù)器屏鳍。后端服務(wù)器為緩存時比較有效勘纯。
注意:在upstream中加入hash語句。server語句中不能寫入weight等其他的參數(shù)钓瞭,hash_method是使用的hash算法驳遵。
upstream zhaosc{
server 192.168.1.100:8080;
server 192.168.1.200:8080;
hash $request_uri;
hash_method crc32;
}
upstream還可以為每個設(shè)備設(shè)置狀態(tài)值,這些狀態(tài)值的含義分別如下:
- down 表示單前的server暫時不參與負(fù)載.
- weight 默認(rèn)為1.weight越大山涡,負(fù)載的權(quán)重就越大堤结。
- max_fails :允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤.
- fail_timeout : max_fails次失敗后鸭丛,暫停的時間竞穷。
- backup: 其它所有的非backup機(jī)器down或者忙的時候,請求backup機(jī)器鳞溉。所以這臺機(jī)器壓力會最輕瘾带。
upstream zhaosc{ #定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài)
ip_hash;
server 192.168.1.100:9090 down;
server 192.168.1.100:8080 weight=2;
server 192.168.1.100:6060;
server 192.168.1.100:7070 backup;
}
由于location模塊內(nèi)容比較多,所以重開一篇熟菲,下一節(jié)詳細(xì)介紹看政。