Nginx是一款開源的、跨平台的高性能web服務器,它有着高性能,穩定性高,配置簡單,模塊結構化,資源消耗低的優點。同時支持反向代理、負載均衡、緩存的功能。其采用多進程+epoll(IO多路復用)模型,也對互聯網高並發連接業務有着很好的支持。
下圖是一個簡單nginx架構:
基本命令:
- 啟動nginx: nginx
- 以特定目錄下的配置文件啟動:nginx -c /特定目錄/nginx.conf
- 重新加載配置:nginx -s reload 執行這個命令后,master進程會等待worker進程處理完當前請求,然后根據最新配置重新創建新的worker進程,完成Nginx配置的熱更新。
- 立即停止服務: nginx -s stop
- 從容停止服務: nginx -s quit 執行該命令后,Nginx在完成當前工作任務后再停止。
- 檢查配置文件是否正確 : nginx -t
- 檢查特定目錄的配置文件是否正確: nginx -t -c /特定目錄/nginx.conf
- 查看版本信息: nginx -v
配置文件:
main
events { ... }
http{
server{
location { ... }
}
}
Nginx默認的配置文件主要有 main、events、http、server、location 五個塊組成。其中 http 、server、location 屬於嵌套關系。
- main:主要控制Nginx子進程所屬的用戶和用戶組、派生子進程數、錯誤日志位置與級別、pid位置、子進程優先級、進程對應cpu、進程能夠打開的文件描述符數目等。
- events:控制Nginx處理連接的方式。
- http:Nginx處理http請求的主要配置塊。
- server:Nginx中主機配置塊,可用於配置多個虛擬主機。
- location:server中對應目錄級別的控制塊,可以有多個。

#運行用戶 user nobody; #工作進程數 worker_processes 1; #全局錯誤日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #工作模式及連接數上限 events { #epoll是多路復用IO(I/O Multiplexing)中的一種方式, #僅用於linux2.6以上內核,可以大大提高nginx的性能 use epoll; #單個后台worker process進程的最大並發鏈接數 worker_connections 1024; } http { #設定mime類型,類型由mime.type文件定義 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 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件, #對於普通應用,必須設為 on, #如果用來進行下載等應用磁盤IO重負載應用,可設置為 off, #以平衡磁盤與網絡I/O處理速度,降低系統的uptime. sendfile on; #tcp_nopush on; #連接超時時間 #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #開啟gzip壓縮 gzip on; gzip_disable "MSIE [1-6]."; #設定請求緩沖 client_header_buffer_size 128k; large_client_header_buffers 4 128k; #設定虛擬主機配置 server { #偵聽80端口 listen 80; #定義使用 www.nginx.cn訪問 server_name www.nginx.cn; #定義服務器的默認網站根目錄位置 root html; #設定本虛擬主機的訪問日志 access_log logs/nginx.access.log main; #默認請求 location / { #定義首頁索引文件的名稱 index index.php index.html index.htm; } # 定義錯誤提示頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { } #靜態文件,nginx自己處理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { #過期30天,靜態文件不怎么更新,過期可以設大一點, #如果頻繁更新,則可以設置得小一點。 expires 30d; } #PHP 腳本請求全部轉發到 FastCGI處理. 使用FastCGI默認配置. location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #禁止訪問 .htxxx 文件 location ~ /.ht { deny all; } } }
其中location根據不同前綴的使用方式,大致分為普通location和正則location。多個正則location之間會按照先后順序進行匹配,匹配成功后,就不會繼續匹配后面定義的location。多個普通location之間遵循“最大匹配原則”,匹配度最高的location將會被執行,同時也可以利用 =精准匹配和 ^~非正則匹配可以在正則匹配之前優先匹配,禁止執行原有的正則匹配。因此 當多種類型的 location 匹配同時出現時,最終執行結果為“= ”匹配優先於"^~"匹配,“^~”匹配優先於正則匹配,正則匹配優先於普通的最大前綴匹配 只要優先的location 匹配成功,就不會執行其他的location 。