一.前述
之前講解了Nginx的原始碼安裝與載入到系統服務中去,http://www.cnblogs.com/LHWorldBlog/p/8298226.html 今天詳細講解Nginx中的具體配置。
二.具體配置
#工作模式與連線數上限
events
{
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本核心中的高效能網路I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#單個程式最大連線數(最大連線數=連線數*程式數)
worker_connections 65535;
}
event下的一些配置及其意義
#單個後臺worker process程式的最大併發連結數
worker_connections 1024;
# 併發總數是 worker_processes 和 worker_connections 的乘積
# 即 max_clients = worker_processes * worker_connections
# 在設定了反向代理的情況下,max_clients = worker_processes * worker_connections / 4 為什麼
# 為什麼上面反向代理要除以4,應該說是一個經驗值
# 根據以上條件,正常情況下的Nginx Server可以應付的最大連線數為:4 * 8000 = 32000
# worker_connections 值的設定跟實體記憶體大小有關
# 因為併發受IO約束,max_clients的值須小於系統可以開啟的最大檔案數(小與控制程式碼數)
# 而系統可以開啟的最大檔案數和記憶體大小成正比,一般1GB記憶體的機器上可以開啟的檔案數大約是10萬左右
# 我們來看看360M記憶體的VPS可以開啟的檔案控制程式碼數是多少:
# $ cat /proc/sys/fs/file-max
# 輸出 34336
# 32000 < 34336,即併發連線總數小於系統可以開啟的檔案控制程式碼總數,這樣就在作業系統可以承受的範圍之內
# 所以,worker_connections 的值需根據 worker_processes 程式數目和系統可以開啟的最大檔案總數進行適當地進行設定
# 使得併發總數小於作業系統可以開啟的最大檔案數目
# 其實質也就是根據主機的物理CPU和記憶體進行配置
# 當然,理論上的併發總數可能會和實際有所偏差,因為主機還有其他的工作程式需要消耗系統資源。
# ulimit -SHn 65535
nginx.conf配置檔案
#定義Nginx執行的使用者和使用者組
user www www;
#nginx程式數,建議設定為等於CPU總核心數。
worker_processes 8;
#全域性錯誤日誌定義型別,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#程式檔案
pid /var/run/nginx.pid;
#一個nginx程式開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(系統的值ulimit -n)與nginx程式數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#設定http伺服器
http
{
include mime.types; #副檔名與檔案型別對映表
default_type application/octet-stream; #預設檔案型別
#charset utf-8; #預設編碼
server_names_hash_bucket_size 128; #伺服器名字的hash表大小
client_header_buffer_size 32k; #上傳檔案大小限制
large_client_header_buffers 4 64k; #設定請求緩
client_max_body_size 8m; #設定請求緩
sendfile on; #開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。send file 高清圖片 大圖片 要關閉
autoindex on; #開啟目錄列表訪問,合適下載伺服器,預設關閉。
tcp_nopush on; #防止網路阻塞
tcp_nodelay on; #防止網路阻塞
keepalive_timeout 120; #長連線超時時間,單位是秒
#gzip模組設定gzip on;(節省頻寬)
#開啟gzip壓縮輸出gzip_min_length 1k; #最小壓縮檔案大小gzip_buffers 4 16k; #壓縮緩衝區gzip_http_version 1.0; #壓縮版本(預設1.1,前端如果是squid2.5請使用1.0)gzip_comp_level 2; #壓縮等級gzip_types text/plain application/x-javascript text/css application/xml;#壓縮型別,預設就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。gzip_vary on;#limit_zone crawler $binary_remote_addr 10m; #開啟限制IP連線數的時候需要使用
# 虛擬主機一些配置及其意義
通過nginx可以實現虛擬主機的配置,nginx支援三種型別的虛擬主機配置,
1、基於ip的虛擬主機, (一塊主機繫結多個ip地址)
2、基於域名的虛擬主機(servername)
3、基於埠的虛擬主機(listen如果不寫ip埠模式)
示例基於虛擬機器ip的配置,這裡需要配置多個ip
server
{
listen 192.168.20.20:80;
server_name www.linuxidc.com;
root /data/www;
}
server
{
listen 192.168.20.21:80;
server_name www.linuxidc.com;
root /data/www;
}
nginx.conf下的配置
http{
server{
#表示一個虛擬主機
}
}
#location 對映(ngx_http_core_module)
location [ = | ~ | ~* | ^~ ] uri { ... }
location URI {}:
對當前路徑及子路徑下的所有物件都生效;
location = URI {}: 注意URL最好為具體路徑。
精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效;
location ~ URI {}:
location ~* URI {}:
模式匹配URI,此處的URI可使用正規表示式,~區分字元大小寫,~*不區分字元大小寫;
location ^~ URI {}:
不使用正規表示式
優先順序:= > ^~ > ~|~* > /|/dir/
/loghaha.html
/logheihei.html
^/log.*html$
#location匹配規則
=字首的指令嚴格匹配這個查詢。如果找到,停止搜尋。
所有剩下的常規字串,最長的匹配。如果這個匹配使用^〜字首,搜尋停止。
正規表示式,在配置檔案中定義的順序。
如果第3條規則產生匹配的話,結果被使用。否則,如同從第2條規則被使用
location 的執行邏輯跟 location 的編輯順序無關。矯正:這句話不全對,“普通 location ”的匹配規則是“最大字首”,因此“普通 location ”的確與 location 編輯順序無關;
但是“正則 location ”的匹配規則是“順序匹配,且只要匹配到第一個就停止後面的匹配”;
“普通location ”與“正則 location ”之間的匹配順序是?先匹配普通 location ,再“考慮”匹配正則 location 。
注意這裡的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”後,有的時候需要繼續匹配“正則 location ”,有的時候則不需要繼續匹配“正則 location ”。兩種情況下,不需要繼續匹配正則 location :
( 1 )當普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續正則匹配;
( 2 )當普通location 恰好嚴格匹配上,不是最大字首匹配,則不再繼續匹配正則
loghaha.html
l: logha
l: ^~ loghah
l: loghaha.html
l: =loghaha.html
l: ^logh.*html$
l: ^logha.*html$
#執行邏輯(!!!)
nginx 收到請求頭:判定ip,port,hosts決定server
nginx location匹配:用客戶端的uri匹配location的uri
先普通
順序無關
最大字首
匹配規則簡單
打斷:
^~
完全匹配
再正則
不完全匹配
正則特殊性:一條URI可以和多條location匹配上
有順序的
先匹配,先應用,即時退出匹配
ps1 :(反向代理理解)
通常的代理伺服器,只用於代理內部網路對Internet的連線請求,客戶機必須指定代理伺服器,並將本來要直接傳送到Web伺服器上的http請求傳送到代理伺服器中由代理伺服器向Internet上的web伺服器發起請求,最終達到客戶機上網的目的。
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器
PS2:總結
uri:決策location
反向代理:proxy_pass ip:port[uri];
PS3.修改預設HTML目錄
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
預設路徑為/usr/share/nginx/html 修改完後的目錄為 /usr/share/alsa/pcm/default.conf。
修改nginx目錄報錯403解決辦法
剛好我就遇到了,一查發現是許可權不足引起;
chmod -R 755 /usr/share/nginx/html
將web目錄設定為755許可權,-R表示向下遞迴
chown -R nginx_user:nginx_user /usr/share/nginx/html