Nginx篇--解讀nginx配置

LHBlog發表於2018-01-17

一.前述

之前講解了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匹配上
有順序的
先匹配,先應用,即時退出匹配

ps: location中的    / 跟
html: 相對於nginx目錄(預設是找尋Nginx中的當前HTML目錄)

ps1 :(反向代理理解)

通常的代理伺服器,只用於代理內部網路對Internet的連線請求,客戶機必須指定代理伺服器,並將本來要直接傳送到Web伺服器上的http請求傳送到代理伺服器中由代理伺服器向Internet上的web伺服器發起請求,最終達到客戶機上網的目的。

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器

 

PS2:總結

 

=絕對匹配

 

~* 正則匹配

 

\.把點轉義

 

/最大字首匹配

 

·~最大字首匹配

 

先找不是正則的 然後找正則的 先匹配先應用

 

host:決策server負責處理
uri:決策location
反向代理:proxy_pass  ip:port[uri];

 

proxy_pass 反向代理

 

 

不帶斜線:將uri透傳過去

 

帶斜線:訪問反向代理的主頁 將URI遮蔽掉
配置負載均衡(反向代理)!!!!!
upstream  httpd-servers {
}
 
 
httpd-servers upstreams 名字

 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

 

相關文章