本文主要內容如下(讓讀者朋友們深入淺出地理解Nginx,有程式碼有範例有圖):
Nginx是一款免費開源的高效能HTTP伺服器及反向代理伺服器產品。
從我個人的實踐經驗出發,我用Nginx做了這麼幾件事情,如下所示:
衍生生態比較出名的一個叫Openresty。Openresty是一款基於 Nginx和LuaJIT的Web平臺,它既具有Nginx擁有的功能,同時由於大量精良的Lua庫,使其更加靈活,能構造出很多玩法。一句話概括,功能更強大了。
關於Openresty安裝可以閱讀我的這篇文章:
OpenResty原始碼編譯安裝
Nginx官方網站:
https://nginx.org/en/
Nginx官方檔案:
http://nginx.org/en/docs/contributing_changes.html
Nginx原始碼:
https://github.com/nginx/nginx
如果大家覺得英文方面閱讀方面有一些困難,不用擔心。一方面可以藉助Google翻譯或其它翻譯工具降低閱讀困難,另外一方面可藉助國內內容網站所包含的豐富內容(如部落格園、知乎、掘金、51CTO、思否、CSDN等這樣的)。
除此之外,Nginx的商業化解決方案可供一些朋友參考,Nginx的商業網站:
https://www.nginx.com/
過去我寫了不少文章,可供大家參考:
server { listen 443 ssl; server_name framework.youcongtech.com; ssl_certificate /home/tech/7788450_framework.youcongtech.com.pem; ssl_certificate_key /home/tech/7788450_framework.youcongtech.com.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { try_files $uri $uri/ /index.html; root /home/tech/project/yc-framework-docs; index index.html index.htm; # root html; # index index.html index.htm; } }
這個是我官網的證書設定,大家可存取分散式微服務架構:YC-Framework官網檢視效果。
YC-Framework官網採用的是第二種方法。
server { listen 80; server_name localhost; return 301 https://127.0.0.1$request_uri; }
server { listen 80; server_name localhost; rewrite ^(.*)$ https://$host$1 permanent; }
location /img/ { alias /home/tech/img/; autoindex on; }
stream { upstream inner_mysql { hash $remote_addr consistent; server 192.168.1.188:3389 weight=5 max_fails=3 fail_timeout=30s; } server { listen 17865; # 資料庫伺服器監聽埠 proxy_connect_timeout 60s; proxy_timeout 300s; # 設定使用者端和代理服務之間的超時時間,如果5分鐘內沒操作將自動斷開。 proxy_pass inner_mysql; } }
#允許跨域請求的域,* 代表所有 add_header 'Access-Control-Allow-Origin' *; #允許請求的header add_header 'Access-Control-Allow-Headers' *; #允許帶上cookie請求 add_header 'Access-Control-Allow-Credentials' 'true'; #允許請求的方法,比如 GET,POST,PUT,DELETE add_header 'Access-Control-Allow-Methods' *;
location / { root /var/www/test; index index.php index.html index.htm; limit_conn addr 5; #是限制每個IP只能發起5個連線 }
location /download {
limit_rate_after 10m;
limit_rate 128k;
}
# 允許部分ip存取 allow 123.45.25.6; allow 123.68.52.125; allow 123.125.25.106; # 禁止其餘ip存取 deny all;
該設定可放server和location中。
location / { auth_basic "網站名稱"; auth_basic_user_file conf.d/passwd; autoindex on; }
詳情可閱讀這篇文章為 Nginx 新增 HTTP 基本認證(HTTP Basic Authentication)
proxy_send_timeout 90; #後端伺服器資料回傳時間(代理傳送超時) proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)
這種場景通常出現在Nginx代理後端服務中。問題的報錯資訊如下:
413 Request Entity Too Large
解決辦法設定如下即可:
client_max_body_size 20m;
Nginx負載均衡有六種策略,分別是輪詢、權重、ip_hash、最少連線、fair、url_hash等)。
upstream backup-server { server 192.168.1.101:8080; server 192.168.1.102:8080; }
upstream backup-server { server 192.168.1.101:8080 weigh=5; server 192.168.1.102:8080 weigh=6; }
upstream backup-server { ip_hash; server 192.168.1.101:8080 weigh=5; server 192.168.1.102:8080 weigh=6; }
upstream backup-server { least_conn; server 192.168.1.101:8080 weigh=5; server 192.168.1.102:8080 weigh=6; }
upstream backup-server { server 192.168.1.101:8080; server 192.168.1.102:8080; fair; }
upstream backup-server { hash $request_uri; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server_tokens off;
HTTP請求一共有九種,分別為GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT等。
這裡我僅僅只允許GET與POST:
if ($request_method !~ ^(GET|POST)$ ) { return 404; }
proxy_buffer_size 4k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小 proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的設定 proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #設定快取資料夾大小,大於這個值,將從upstream伺服器傳
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) { return 403; }
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ { rewrite ^/(.*)$ $host permanent; }
if ( $host !~* 'youcongtech.com' ) { return 403; }
user nginx www;
autoindex off;
client_max_body_size 18m
關於Nginx相關版本資訊可存取如下網址獲取(Nginx下載地址):
https://nginx.org/en/download.html
當然了,這僅僅是從Nginx的安全形度出發,光從Nginx出發只能在一定程度上保障Nginx本身的安全,還是得從伺服器層面乃至制度層面入手。伺服器層面我曾寫過一些文章,可供讀者朋友參考:
伺服器安全策略之思考與實踐
由圖可知,架構設計的核心主要體現如下:
Nginx原始碼目錄為如下:
- core (該目錄存放core module的程式碼,也是nginx服務的入口) - event (nginx 自身對事件處理邏輯的封裝) - http (http core module 的程式碼,nginx作為web/http proxy server執行時的核心模組) - mail (mail core module 的程式碼,nginx作為pop3/imap/smtp proxy server執行時的核心模組) - misc (nginx 的一些utils,定義了test和profiler的一些外圍模組的邏輯) - os (nginx對各個平臺抽象邏輯的封裝) - stream (nginx用來實現四層協定的轉發、代理和負載均衡)
光憑這一篇文章很難深入到Nginx的各種細節當中,不過此文章著重體現兩個方面,第一個方面是Nginx各種設定範例(基本來源於我個人架構生涯中的Nginx實戰),第二個方面總覽Nginx架構,明確架構核心、啟動流程、原始碼目錄的含義等(讀者朋友可根據自己需要進行查閱相關資料並深入學習實踐等)。