配置文件
- 主配置文件:/usr/local/nginx/conf/nginx.conf
- 通過nginx -c 可以指定要讀取的配置文件來啟動
- nginx常見的配置文件及作用:
| 配置文件 | 作用 |
|---|---|
| nginx.conf | nginx的基本配置文件 |
| mime.types | MIME類型關聯的擴展文件 |
| fastcgi.conf | 與fastcgi相關的配置文件 |
| proxy.conf | 與proxy相關的配置 |
| sites.conf | 配置nginx提供的網站,包括虛擬主機 |
nginx.conf配置文件詳解
- nginx.conf的內容分為以下幾段:
- main配置段:全局配置段。其中main配置段中可能包含event配置段;
- event{}:定義event模型工作特性;
- http{}:定義http協議相關配置。
- 配置指令:(注:以分號結尾)
- 格式如下:
derective value1 [value2 … …];
- 支持使用變量:
- 內置變量:模塊會提供內置變量
- 自定義變量:如下
set var_name value
用於調試、定位問題的配置參數
注:主配置段
daemon {on|off}; //是否已守護進程運行進程nginx,調試時應設置為off
master_process {on|off}; //是否以master/worker模型來運行nginx,調試時可以設置為off
error_log 位置1 級別2; //配置錯誤日志(位置與級別有以下選項,點擊腳注)
正常運行必備的配置參數
user USERNSME {GROUPNAME}; //指定運行worker進程的用戶和組;
pid /path/to/pid_file; //指定nginx守護進程的pid文件
worker_rlimit_nofile NUMBER; //設置所有worker進程最大可以打開的文件數,默認為1024;
worker_rlimit_core SIZE; //指明所有worker進程所能夠使用的總體的最大核心文件大小,保持默認即可
優化性能的配置參數
worker_processse N; //啟動N個worker進程,這里的N為了避免上下文切換,通常設置為cpu總核數-1或等於總t核數
worker_cpu_affinity CPUMASK3 [CPUMASK…]; //將進程綁定到某個CPU中,避免頻繁刷新緩存
time_resolution INTERVAL; //計時器解析度。降低此值,可減少gettimeofday()系統調用的次數
worker_priority NUMBER; //指明worker進程的NICE值(優先級)
事件相關配置
注:event{}段中的配置參數
use epoll; //多路復用I/O中的一種方式,僅用於linux2.6以上內核,大大提升nginx性能
accept_mutex {on|off}; //master調度用戶請求至各worker進程時使用的負載均衡鎖,“on”表示能讓多個worker輪流地、序列化地去響應新請求
lock_file FILE; //accept_nutex用到的互斥鎖鎖文件路徑
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建議讓nginx自行選擇
worker_connections #; //每個進程能夠接受的最大連接數
multi_accept on; //盡可能多的接受請求
Fastcgi相關配置參數
- LNMP:php要啟用fpm模型
- 配置示例如下:
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; }
注:當LNMP架構分台部署,“/scripts”需換成php的目錄
常需要調整的參數
worker_processes NUMBER //啟動NUMBER個worker進程
worker_cpu_affinity CPUMASK3 //綁定CPU核心數
worker_connections NUMBER //綁定的CPU核心每個最大連接數
worker_priorty NUMBER //調整nice值
nginx作為web服務器時使用的配置
注:http{}段配置的參數
- http{}段:由ngx_http_core_module模塊引入
- http配置主要包含四個區塊,結構如下:
http { ## 協議級別
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
sendfile on; ##指定nginx是否調用sendfile函數(zero copy)來輸出文件,對於普通應用必須設為on;
##如果用來進行下載等應用磁盤I/O重負載應用,可設置為OFF,以平衡磁盤與網絡I/O處理速度,降低系統的uptime
autoindex on; ##開啟目錄列表訪問,適合下載服務器,默認關閉
upstream { ##負載均衡配置
...
}
server { ##服務器級別,每一個server類似於httpd中的一個<VirtualHost,通俗來說就是一個網站>
listen80;
server_name localhost;
location / { ##請求級別,類似與httpd中的<Location>,用於定義URL與本地文件系統的映射關系
root html;
index index.html index.htm;
}
}
}
- http{}段配置指令:
1)server{}:定義一個虛擬主機,示例如下:
server { listen 80; server_name www.idfsoft.com; root "/vhosts/web"; }
注:
listen指定監聽的地址和端口寫法:
listen ADDRESS[:PORT];
listen PORT;
server_name NAME1 [NAME2...]; ##后面可以跟多個主機,名稱可以用正則表達式或通配符
當有多個server時,匹配順序如下:
1.先做精確匹配檢查;
2.左側通配符匹配檢查,如.idfsoft.com
3.右側通配符匹配檢查,如mail.
4.正則表達式匹配檢查,如~ ^.*.idfsoft.com$
5.default_server
2)location區段,通過指定模式來與客戶端請求的URI相匹配
- 功能:允許根據用戶請求的URI來匹配定義的各location,匹配到時,此請求將被響應的location配置快中的配置所處理,例如做訪問控制等功能
- 語法:如下
location [修飾符] pattern {…}
- 常用的修飾符說明:
| 修飾符 | 功能 |
|---|---|
| = | 精確匹配 |
| ~ | 正則表達式模式匹配,區分大小寫 |
| ~* | 正則表達式模式匹配,不區分大小寫 |
| ^~ | 前綴匹配,類似於無修飾符的行為,也是以指定模塊開始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正則表達式 |
| @ | 定義命名location區段,這些區段客戶端不能訪問,只可以有內部產生的請求訪問,如try_files或error_page等 |
(1)沒有修飾符表示必須以指定模式開始,如:
server {
server_name www.baibai.com;
location /abc {
......
}
}
那么如下內容可以就可以正確匹配:
(2)=:表示必須與指定的模式精確匹配,如:
server {
server_name www.baibai.com;
location = /abc {
......
}
}
那么如下內容可正確匹配:
如下內容則無法匹配:
(3)~:表示指定的正則表達式要區分大小寫,如:
server {
server_name www.baibai.com;
location ~ ^/abc$ {
......
}
}
那么如下內容可以正確匹配:
如下內容則無法匹配:
(4)~*:表示指定的正則表達式不區分大小寫,如:
server {
server_name www.baibai.com;
location ~* ^/abc$ {
......
}
}
那么如下內容就可以正確匹配:
如下內容則無法匹配:
查找順序和優先級,由高到底依次為:
- 帶有“=”的精確匹配優先
- 正則表達式
- 沒有修飾符的精確匹配
注:有多個正則表達式出現時,按照它們在配置文件中定義的順序
訪問控制
注:用於location段,可以用主機地址表示,也可用網段表示,必須一起用
allow:設定允許那台或那些主機訪問,多個參數間用空格隔開
deny:設定禁止那台或那些主機訪問,多個參數間用空格隔開
例:
location / {
root html;
index index.php index.html index.htm;
allow 192.168.91.129/32;
deny all;
}
-
在地址為192.168.91.1中訪問

-
在地址為192.168.91.129中訪問

基於用戶認證
**注:用於location段,必須一起用
auth_basic “歡迎信息”;
auth_basic_user_file FILE_PATH4;
https配置
- 創建簽名證書存放目錄
[root@localhost ~]# mkdir /usr/local/nginx/ssl
- 創建服務器私鑰
[root@localhost ssl]# openssl genrsa -des3 -out nginx.key 1024
Generating RSA private key, 1024 bit long modulus
..............................................................++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for nginx.key: ##輸入密匙
Verifying - Enter pass phrase for nginx.key: ##確認密匙
[root@localhost ssl]# ls
nginx.key
- 創建簽名請求證書(CSR)
[root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr Enter pass phrase for nginx.key: ##輸入密匙 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN ##國家 State or Province Name (full name) []:HB #省 Locality Name (eg, city) [Default City]:WH ##城市 Organization Name (eg, company) [Default Company Ltd]:www.baibai.com ##公司名稱 Organizational Unit Name (eg, section) []:www.baibai.com ##部門 Common Name (eg, your name or your server's hostname) []:www.baibai.com ##主機名 Email Address []:1@2.com ##郵箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ##可以不用輸入
An optional company name []: ##可以不用輸入
[root@localhost ssl]# ls
nginx.csr nginx.key
-生成crt
[root@localhost ssl]# openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
Signature ok
subject=/C=CN/ST=HB/L=WH/O=www.baibai.com/OU=www.baibai.com/CN=www.baibai.com/emailAddress=1@2.com
Getting Private key
Enter pass phrase for nginx.key:
[root@localhost ssl]# ls
nginx.crt nginx.csr nginx.key
- 編輯配置文件/usr/local/nginx/conf/nginx.server
# HTTPS serverserver { listen 443 ssl; server_name localhost; ssl_certificate ../ssl/nginx.crt; ##或者/usr/local/nginx/ssl/nginx.crt ssl_certificate_key ../ssl/nginx.key; ##/usr/local/nginx/ssl/nginx.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; } }
}
- 檢查配置文件,並重新啟動nginx服務
[root@localhost ~]# nginx -t
Enter PEM pass phrase:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload
Enter PEM pass phrase:
- 在瀏覽器中輸入https://服務器的IP地址,點擊繼續前往


開啟狀態界面
stub_status {on|off};
- 配置如下:
location /status { ##URI不唯一
stub_status on;
allow 192.168.91.129/32; ##允許查看的地址
deny all;
}
- 訪問狀態頁面方式:http://服務器IP/status

- 狀態頁面信息詳解,如下表:
| 狀態碼 | 表示的意義 |
|---|---|
| Active connections 2 | 當前所有處於打開狀態的連接數 |
| accepts | 總共處理了多少個連接 |
| handled | 成功創建多少握手 |
| requests | 總共處理了多少個請求 |
| Reading | nginx讀取到客戶端的Header信息數,表示正處於接受請求狀態的連接數 |
| Writing | nginx返回給客戶端的Header信息數,表示請求已經接受完成,且正處於處理請求或者發送響應的過程中的連接數 |
| Waiting | 開啟keep-alive的情況下,這個值等於active-(reading + weiting),意思就是nginx已處理完承載等候下一次請求指令的駐留連接 |
rewrite
注:server段,location段,if中
- 語法:
rewrite REGEX REPLACEMENT FLAG;
- 適用於文件存放路徑或者名字被修改后進行重寫
例:
rewrite ^/images/(.*.jpg)$ /imgs/$1 break;
此處的$1用於引用(*.jpg)匹配到的內容,又如:
rewrite ^/images/(.*)$ http://www.baidu.com redirect;
如上所示,REPLACEMENT可以是某個路徑,也可以是某個URL
- 常見的FLAG,如下圖:
| FLAG | 作用 |
|---|---|
| last | 基本上都用這個FLAG,表示當前的匹配結束,繼續下一個匹配,最多匹配10到20個,一旦此rewrite規則重寫完成后,就不會再被后面的其他rewrite規則進行處理,而是由UserAgent重新對重寫后的URL再一次發起請求,並從頭開始執行類似的過程 |
| break | 中止Rewrite,不在繼續匹配,一旦此rewrite規則重寫完成后,有useragent對新的URL重新發起請求,且不會再被當前location內的任何rewrite規則所檢查 |
| redirect | 已臨時重定向的http狀態302返回新的URL |
| permanent | 以永久從定向的http狀態301返回新的URl |
rewrite模塊的作用是用來執行URL重定向,這個機制有利於去掉惡意訪問的URL,也有利於搜索引擎的優化
nginx使用的語法源於Perl兼容正則表達式庫,基本語法如下表:
| 標識符 | 意義 |
|---|---|
| ^ | 必須以^后的實體開頭 |
| $ | 必須以$前的實體開頭 |
| . | 匹配任意字符 |
| [] | 匹配指定字符集內的任意字符 |
| [^] | 匹配任何不包括在指定字符集內的任意字符串 |
| | | 匹配 | 之前或之后的實體 |
| () | 分組,組成一組用於匹配的實體,通常會有 | 來協助 |
捕獲子表達式,可以捕獲放在()之間的任何文本,比如:
^(hello|sir)$ //字符串為“hello sir”,捕獲的結果:$1=hello,$2=sir
注:這些被捕獲的數據,在后面就可以當變量一樣使用
nginx中if語法與應用
- 語法:
if (CONDITION) {…}
- 應用場景
- server段
- location段
-常見的CONDITION - 變量名(比量值為空竄,或者以“0”開始,則為false,其他的均為true)
- 以變量為操作數構成的比較表達式(可使用=,!=類似的比較操作符進行測試)
- 正則表達式的模式匹配操作:
1)~:區分大小寫的模式匹配檢查
2)~*:不區分大小寫的模式匹配檢查
3)!~ 和 !~*:對上面兩種測試取反 - 測試指定路徑為文件的可能性(-f,!-f)
- 測試指定路徑為目錄的可能性(-d,!-d)
- 測試文件的存在性(-e,!-e)
- 檢查文件是否有執行權限(-x,!-x)
基於瀏覽器實現分離案例
if ($http_user_agent ~ Firefox) { ##火狐瀏覽器
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) { ##微軟瀏覽器
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) { ##谷歌瀏覽器
rewrite ^(.*)$ /chrome/$1 break;
}
防盜鏈案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked DOMAIN_NAME; ##DOMAIN_NAME只公司的域名
if ($invalid_referer) {
rewrite ^/ http://DOMAIN_NAME/403.html;
}
}
反向代理與負載均衡
- nginx通常被用作后端服務器的反向代理,這樣就可以很方便的實現動靜分離以及負載均衡,從而大大提高服務器的處理能力。
- nginx實現動靜分離,其實就是在反向代理的時候,如果是靜態資源,就直接從nginx發布的路徑去讀取,而不是需要從后台服務器獲取;但是要注意,這種情況下需要保證后端跟前端的程序保持一致,可以使用Rsync+inotify做服務端自動同步或者使用NFS、MFS分布式共享存儲。
- Http Proxy模塊,功能很多,最常用的是proxy_pass和proxy_cache;若要使用proxy_cache,需要集成第三方的ngx_cache_purge模塊,用來清楚指定的URL緩存。這個集成需要在安裝nginx的時候去做,如:
./configure --add-module=…/ngx_cache_purge…
- nginx通過upstream模塊來實現簡單的負載均衡,upstream需要定義在http段內,訪問靜態資源在location \ {}段中;訪問動態資源在location ~ /(.*\.php) {} 中或者其他定義動態location中,如:
http {
upstream NAME { ##NAME,集群名字,必須與location中的NAME保持一致
server 192.168.91.129:80;
server 192.168.91.130:80;
}
server {
listen 80;
server_name www.baibai.com;
location / { ##動態資源訪問location ~ /(.*\.php) { 段中
root html;
index index.html index.htm;
proxy_pass http://NAME; ##與upstream中保持一致
}
}
}
- 在upstream段內,定義一個服務器列表,默認的方式是輪詢,如果要確定同一個訪問者發出的請求總是由同一個后端服務器來處理,可以設置ip_hash,如:
upstream NAME { ip_hash; server 192.168.91.129:80 weight=5; server 192.168.91.130:80 weight=5; }
注:upstream用於http{}段
注:設置weight的值會將服務器的處理量增加,表示192.168.91.129被訪問5次將后再將其他訪問請求交給192.168.91.130
注意:這個方法本質還是輪詢,而且由於客戶端的IP地址可能是不斷變化的,比如動態IP,翻牆等,因此ip_hash並不能完全保證同一個客戶端總是由同一個服務器來處理。
位置
file
stderr
syslog:server=address[,parameter=value]
memory:size ↩︎級別(級別的從大到小排列)
debug:若要使用debug級別,需要在編譯nginx時使用- -with-debug選項
info
notice
warn
error
crit
alert
emerg ↩︎CPUMASK:使用8位二進制表示CPU核心
第一顆CPU核心:00000001
第二顆CPU核心:00000010
第三顆CPU核心:00000100
第四顆CPU核心:00001000
第五顆CPU核心:00010000
第六顆CPU核心:00100000
第七顆CPU核心:01000000
第八顆CPU核心:10000000 ↩︎ ↩︎FILE_PATH內容格式:
username:password
注:手工創建不能夠生效,建議用htpasswd命令來創建此文件,命令如下
htpasswd -c -m FILE_PATH USERNAME ↩︎
</div>
