Nginx 做爲高性能的 http 服務器,知名度沒必要多言,類似產品中無出其右。本篇隨筆記錄我認爲較爲重要的原理和配置。
html
以上是 Nginx 的結構圖,其包含一個 master 和 n 個 worker,master_processes 用於外部通訊和統一管理其下 worker_processes ,所以能夠作到重啓時不中斷服務。另外,Nginx 採用了異步非阻塞的方式來處理請求,避免了 cpu 閒置,這是其高性能的主要起因。nginx
Nginx 從功能上可分爲如下三大類:web
Handlers(處理器模塊):用於直接處理請求,並進行輸出內容和修改 headers 信息等操做,通常只能有一個。後端
Filters(過濾器模塊):主要對處理器模塊輸出的內容進行修改操做,而後輸出。服務器
Proxies(代理模塊):主要是 upstream 模塊,與後端一些服務好比 FastCGI 等進行交互,實現服務代理和負載均衡等功能。app
上圖是 Nginx 常規的 HTTP 請求和響應過程,當接到請求時,經過查找配置文件將其映射到一個 location block,並按照其中所配置的各個指令,啓動不一樣的模塊去完成工做。一般一個 location 中的指令會涉及一個
handler 模塊和多個 filter 模塊。另外,Nginx 的模塊屬於靜態編譯方式,在啓動後自動加載。負載均衡
Nginx 對於我來講最常規的運用就是靜態資源處理和反向代理,所以我只記錄這些相關的配置。Nginx 配置通常分爲三部分:global、events 和 http,通用基本配置通常保存在 /etc/nginx/nginx.conf
文件中,具體的服務配置通常保存在 /etc/nginx/conf.d/
文件夾下。異步
通常在 nginx.conf
配置文件的開頭位置設置一些與具體業務無關的參數,以下:tcp
user nginx; # 用戶或者用戶組 worker_processes 2; # worker 進程數,通常與服務器的虛擬內核數相等 error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
Events 中須要自行調整的就一個必要參數:worker_connections,這個數值涉及到最大鏈接數的計算,即:性能
# nginx 做爲 http 服務器的時候: max_clients = worker_processes * worker_connections # nginx做爲反向代理服務器的時候: max_clients = worker_processes * worker_connections/4
固然這個最大鏈接數還與系統可打開的最大文件數有關,max_clients 必需要小於 file-max(cat /proc/sys/fs/file-max
),個人配置:
events { worker_connections 2048; }
通常狀況下虛擬主機之外的配置保持默認就好了,如:gzip 壓縮,ip 獲取等通常都交給雲服務器的負載均衡處理了,寫一下默認值吧:
http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
真正的與業務相關的配置都在這個小節,順着流程來說吧。如今不管是公司站仍是我的站都應該普及了 https 了吧(運營商的 http 劫持實在太流氓了,特別是手機端的 web,再強調一遍,流氓,流氓...),這裏面涉及到一個 https 強制跳轉問題,可讓負載均衡的 80 端口來監聽服務器的 81 端口進行重定向:
server { listen 81; return 301 https://$host$request_uri; }
若是是靜態網頁相關的配置,能夠參考default.conf
:
server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
Nginx 更多的狀況是用做反向代理:
server { listen 80; server_name x.youclk.com; location / { proxy_pass http://x; # Proxy Settings # proxy_redirect off; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 80; server_name y.youclk.com; location / { proxy_pass http://y; } }
沒啥好說的,不作特殊用途的話如下命令可以知足操做了:
service nginx {start|stop|status|restart|reload|configtest}
本篇隨筆能夠說是 Nginx 的一些基本摘要,使用和原理方面都沒有深刻探究,後續若是使用到更高級功能或者有新的應用場景,再來繼續補充內容。
個人公衆號《有刻》,咱們共同成長!