1、主配置段
一、正常運行必備的配置
#運行用戶和組,組身份能夠省略
user nginx nginx;
#指定nginx守護進程的pid文件
pid path/to/nginx.pid;
#指定全部worker進程所能打開的最大文件句柄數
worker_rlimit_nofile 100000;
二、性能優化相關的配置
#worker進程的個數,一般應該略少於CPU物理核心數,也可使用auto自動獲取
worker_processes auto;
#CPU的親緣性綁定(一樣是沒法避免CPU的上下文的切換的)
#優勢:提高緩存的命中率
#context switch:會產生CPU沒必要要的消耗
work_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#計時器解析度(請求到達nginx,nginx相應用戶請求後,要獲取系統時間並記錄日誌,高併發的時候可能每秒鐘獲取不少不少次)
#下降此值,能夠減小gettimeofday()系統調用的次數
timer_resolution 100ms;
#指明worker進程的nice值:數字越小,優先級越高
#nice值範圍:-20,19
#對應的優先級:100,139
worker_priority number;
2、事件相關的配置
events {
#master調度用戶請求至個worker進程時使用的負載均衡鎖:on表示能讓多個worker輪流地、序列化的響應新請求
accept_mutex {off|on}
#延遲等待時間,默認爲500ms
accept_mutex_delay time;
#accept_mutex用到的鎖文件路徑
lock_file file;
#指明使用的時間模型:建議讓Nginx自行選擇
use [epoll|rtsig|select|poll];
#單個worker進程打開的最大併發鏈接數,worker_processes*worker_connections
worker_connections 2048;
#告訴nginx收到一個新連接通知後接受盡量多的連接
multi_accept on;
}
3、用於調試、定位問題
#是否以守護進程方式運行nginx;調試時應該設置爲off
daemon {on|off}
#是否以master/worker模型來運行;調試時能夠設置爲off
master_process {on|off}
#error_log 位置 級別,若要使用debug,須要在編譯nginx時使用--with-debug選項
error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug|info|notice|warn|error|crit|alert|emerg];
總結:常須要調整的參數:worker_processes, worker_connections,work_cpu_affinity,worker_priority
新改動配置生效方式:
nginx -s reload其餘參數stop,quit,reopen也可使用nginx -h查看到
4、nginx做爲web服務器使用的配置
http {}:由ngx_http_core_module模塊所引入
配置框架:
http {
upstream {
...
}
server {
location URL {
root "/path/to/somedir"
...
}#相似於httpd中的<Location>,用於定義URL與本地文件系統的映射關係
location URL {
if ... {
...
}
}
}#每一個server相似於httpd中的一個<VirtualHost>
server {
...
}
}
注意:與http相關的額指令僅可以防止與http、server、location、upstream、if上下文,但有些指令僅應用於這5種上下文的某些種。
http {
#打開或關閉錯誤頁面中的nginx版本號
server_tokens on;
#!server_tag on;
#!server_info on;
#優化磁盤IO設置,指定nginx是否調用sendfile函數來輸出文件,普通應用設爲on,下載等磁盤IO高的應用,可設爲off
sendfile on;
#設置nginx在一個數據包裏發送全部頭文件,而不是一個接一個的發送
tcp_nopush on;
#設置nginx不要緩存數據,而是一段一段的發送,
#長鏈接的超時時長,默認爲75s
keepalive_timeout 30;
#在一個長鏈接所可以容許請求的最大資源數
keepalive_requests 20;
#爲制定類型的User Agent禁用長鏈接
keepalive_disable [msie6|safari|none];
#是否對長鏈接使用TCP_NODELAY選項,不將多個小文件合併傳輸
tcp_nodelay on;
#讀取http請求報文首部的超時時長
client_header_timeout #;
#讀取http請求報文body部分的超時時長
client_body_timeout #;
#發送響應報文的超時時長
send_timeout #;
#設置用戶保存各類key的共享內存的參數,5m指的是5兆
limit_conn_zone $binary_remote_addr zone=addr:5m;
#爲給定的key設置最大的鏈接數,這裏的key是addr,設定的值是100,就是說容許每個IP地址最多同時打開100個鏈接
limit_conn addr 100;
#include指在當前文件中包含另外一個文件內容
include mime.types;
#設置文件使用默認的mine-type
default_type text/html;
#設置默認字符集
charset UTF-8;
#設置nginx採用gzip壓縮的形式發送數據,減小發送數據量,但會增長請求處理時間及CPU處理時間,須要權衡
gzip on;
#加vary給代理服務器使用,針對有的瀏覽器支持壓縮,有個不支持,根據客戶端的HTTP頭來判斷是否須要壓縮
gzip_vary on;
#nginx在壓縮資源以前,先查找是否有預先gzip處理過的資源
#!gzip_static on;
#爲指定的客戶端禁用gzip功能
gzip_disable "MSIE[1-6]\.";
#容許或禁止壓縮基於請求和相應的響應流,any表明壓縮全部請求
gzip_proxied any;
#設置對數據啓用壓縮的最少字節數,若是請求小於10240字節則不壓縮,會影響請求速度
gzip_min_length 10240;
#設置數據壓縮等級,1-9之間,9最慢壓縮比最大
gzip_comp_level 2;
#設置須要壓縮的數據格式
gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;
#開發緩存的同時也指定了緩存文件的最大數量,20s若是文件沒有請求則刪除緩存
open_file_cache max=100000 inactive=20s;
#指多長時間檢查一次緩存的有效信息
open_file_cache_valid 60s;
#文件緩存最小的訪問次數,只有訪問超過5次的纔會被緩存
open_file_cache_min_uses 5;
#當搜索一個文件時是否緩存錯誤信息
open_file_cache_errors on;
#容許客戶端請求的最大單文件字節數
client_max_body_size 8m;
#衝區代理緩衝用戶端請求的最大字節數
client_header_buffer_size 32k;
#引用/etc/nginx/vhosts下的全部配置文件,若是主機名衆多的狀況下能夠每一個主機名創建一個文件,以方便管理
include /etc/nginx/vhosts/*;
}
5、虛擬主機設定模塊
#負載均衡服務器列表(本人一般把負載均衡類別配置在相應的虛擬主機的配置文件中)
upstream fansik {
#後端服務器訪問規則
ip_hash;
#weight參數表示權重值,權值越高被分配到的概率越大
server 192.168.1.101:8081 weight=5;
server 192.168.1.102:8081 max_fails=3 fail_timeout=10s;
}
server {
#監聽80端口
listen 80;
#定義主機名,主機名能夠有多個,名稱還可使用正則表達式(~)或通配符
#(1)先作精確匹配檢查
#(2)左側通配符匹配檢查:*.fansik.com
#(3)右側通配符匹配檢查:mail.*
#(4)正則表達式匹配檢查:如~^.*\.fansik\.com$
#(5)detault_server
server_name fansik.fansik.com;
#設定本虛擬主機的訪問日誌
access_log logs/fansik.fansik.com.access.log;
location [=|~|~*|^~] uri {...}
功能:容許根據用戶請求的URI來匹配定義的個location,匹配到時,此請求將被相應的location配置塊中的配置所處理
=:表示精確匹配檢查
~:正則表達式模式匹配檢查,區分字符大小寫
~*:正則表達式模式匹配檢查,不區分字符大小寫
^~:URI的前半部分匹配,不支持正則表達式
!~:開頭表示區分大小寫的不匹配的正則
!~*:開頭表示不區分大小寫的不匹配的正則
/:通用匹配,任何請求都會被匹配到
location / {
#定義服務器的默認網站根目錄位置
root html;
#定義首頁索引文件的名稱
index index.html index.htm;
#引用反向代理的配置,配置文件目錄根據編譯參數而定
#若是編譯時加入了--conf-path=/etc/nginx/nginx.conf指定了配置文件的路徑那麼就把proxy.conf放在/etc/nginx/目錄下
#若是沒有制定配置文件路徑那麼就把proxy.conf配置放到nginx的conf目錄下
include proxy.conf;
#定義後端負載服務器組
proxy_pass http://fansik;
}
alias path和root path的區別;
location /images/ {
root "/data/images"
}
http://fansik.fansik.com/images/a.jpg <-- /data/images/images/a.jpg
location /images/ {
alias "/data/images/"
}
http://fansik.fansik.com/images/a.jpg <-- /data/images/a.jpg
#定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#設定查看Nginx狀態的地址
#只能定義在location中
#htpasswd -c -m /etc/nginx/.htpasswd fansik(-c 參數第一次建立時使用)
location /Status {
stub_status on;
allow all;
#access_log off;
#allow 192.168.1.0/24;
#deny all;
#auth_basic "Status";
#auth_basic_user_file /etc/nginx/.htpasswd;
}
status結果實例說明:
Active connections: 1 (當前全部處於打開狀態的鏈接數)
server accepts handled requests
174(已經接受進來的鏈接) 174(已經處理過的鏈接) 492(處理的請求,在保持鏈接模式下,請求數可能會多於鏈接數量)
Reading: 0 Writing: 1 Waiting: 0
Reading:正處於接受請求狀態的鏈接數
Writing:請求接受完成,正處於處理請求或發送相應的過程當中的鏈接數
Waiting:保持鏈接模式,且處於活動狀態的鏈接數
#基於IP的訪問控制
allow IP/Netmask
deny IP/Netmask
location ~ /\.ht {
deny all;
}
}
6、反向代理的配置(反向代理的配置一般放在單獨的配置文件中proxy.conf,經過include引用)
proxy_redirect off;
#後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#nginx跟後端服務器鏈接超時時間(代理鏈接超時)
proxy_connect_timeout 60;
#鏈接成功後,後端服務器響應時間(代理接收超時)
proxy_read_timeout 120;
#後端服務器數據回傳時間(代理髮送超時)
proxy_send_timeout 20;
#設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffer_size 32k;
#proxy_buffers緩衝區,網頁平均在32k如下的設置
proxy_buffers 4 128k;
#高負荷下緩衝大小(proxy_buffers*2)
proxy_busy_buffers_size 256k;
#設定緩存文件夾大小,大於這個值,將從upstream服務器傳
proxy_temp_file_write_size 256k;
#1G內存緩衝空間,3天不用刪除,最大磁盤緩衝空間2G
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_one:1024m inactive=3d max_size=2g;
7、https服務的配置
server {
listen 443 ssl;
server_name test.fansik.cn;
ssl_certificate 100doc.cn.crt;
ssl_certificate_key 100doc.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
root /data/app
index index.html index.htm;
}
}
8、url地址重寫
rewrite regex replacment flag
例如:rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;#$1是前面括號中的內容哦
http://fansik.fansik.com/images/a/1.jpg --> http://fansik.fansik.com/imgs/a/1.jpg
flag:
last:一旦此rewrite規則重寫完成後,再也不被後面其餘的rewrite規則進行處理,
而是由User Agent從新對重寫後的URL再一次發起請求,並從頭開始執行相似的過程。
break:一旦此rewrite規則重寫完成以後,由User Agent對新的URL從新發起請求,
且不會被當前location內的任何rewrite規則過檢查
redirect:以302響應碼(臨時重定向)返回新的URL
permanent:以301響應碼(永久重定向)返回新的URL
9、if判斷
語法:if (condition) {...}
應用環境:server,location
condition:
(1)變量名:
變量值爲空串,或者以"0"開始,則爲false,其餘的均爲true
(2)以變量爲操做數構成的比較表達式
可使用=,!=相似的比較操做符進行測試
(3)正則表達式的模式匹配操做
~:區分大小寫的模式匹配檢查
~*:不區分大小寫的模式匹配檢查
!~和!~*:對上面兩種測試取反
(4)測試路徑爲文件可能性:-f ,~-f
(5)測試製定路徑爲目錄的可能性:-d,!-d
(6)測試文件存在性:-e,!-e
(7)檢查文件是否有執行權限:-x,!-x
例如:
if($http_user_agent ~* MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
10、防盜鏈
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer none blocked www.fansik.com;
if ($invalid_referer) {
rewrite ^/ http://www.fansik.com/403.html;
}
}javascript