本文主要內容如下(讓讀者朋友們深入淺出地理解Nginx,有程式碼有示例有圖):
- 1.Nginx是什麼?
- 2.Nginx具有哪些功能?
- 3.Nginx的應用場景有哪些?
- 4.Nginx的衍生生態有哪些?
- 5.Nginx開源相關資料有哪些?
- 6.Nginx怎麼樣安裝?
- 7.Nginx常用的配置包含哪些?以及是怎麼配置的?
- 8.Nginx的安全策略需要從哪些方面考慮?
- 9.Nginx架構是怎樣的?
- 10.總結
一、Nginx是什麼?
Nginx是一款免費開源的高效能HTTP伺服器及反向代理伺服器產品。
二、Nginx具有哪些功能?
- 1.正向代理與反向代理。
- 2.負載均衡。
- 3.Web快取。
- 4.動靜分離。
三、Nginx的應用場景有哪些?
從我個人的實踐經驗出發,我用Nginx做了這麼幾件事情,如下所示:
- 1.個人網站(如YC-Framework官網就是放在Nginx對應的目錄下)或者是公司官網。
- 2.外部閘道器代理(內部閘道器用SpringCloud Gateway,外部閘道器用Nginx)。
- 3.基於Nginx+FTP的檔案服務搭建。
- 4.Nginx代理後端服務叢集(負載均衡機制的體現)。
- 5.基於Nginx Basic認證控制系統訪問許可權。
- 6.內網對映代理。
- 7.配置https。
- 8.黑白名單。
四、Nginx的衍生生態有哪些?
衍生生態比較出名的一個叫Openresty。Openresty是一款基於 Nginx和LuaJIT的Web平臺,它既具有Nginx擁有的功能,同時由於大量精良的Lua庫,使其更加靈活,能構造出很多玩法。一句話概括,功能更強大了。
關於Openresty安裝可以閱讀我的這篇文章:
OpenResty原始碼編譯安裝
五、Nginx開源相關資料有哪些?
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/
六、Nginx怎麼樣安裝?
過去我寫了不少文章,可供大家參考:
七、Nginx常用的配置包含哪些?以及是怎麼配置的?
1.Nginx怎樣配置HTTPS?
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官網檢視效果。
2.Nginx開啟SSL以後如何將HTTP重定向到HTTPS呢?
YC-Framework官網採用的是第二種方法。
(1)第一種方法
server { listen 80; server_name localhost; return 301 https://127.0.0.1$request_uri; }
(2)第二種方法
server { listen 80; server_name localhost; rewrite ^(.*)$ https://$host$1 permanent; }
(3)Nginx如何配置靜態資源對映?
location /img/ { alias /home/tech/img/; autoindex on; }
(4)Nginx如何代理內部伺服器某個中介軟體(如MySQL)?
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; } }
(5)Nginx如何配置跨域?
#允許跨域請求的域,* 代表所有 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' *;
(6)Nginx如何配置限制連線?
location / { root /var/www/test; index index.php index.html index.htm; limit_conn addr 5; #是限制每個IP只能發起5個連線 }
(7)Nginx如何配置限制下載速度?
location /download {
limit_rate_after 10m;
limit_rate 128k;
}
(8)Nginx如何限制IP訪問?
# 允許部分ip訪問 allow 123.45.25.6; allow 123.68.52.125; allow 123.125.25.106; # 禁止其餘ip訪問 deny all;
該配置可放server和location中。
(9)Nginx如何配置HTTP Basic認證?
location / { auth_basic "網站名稱"; auth_basic_user_file conf.d/passwd; autoindex on; }
詳情可閱讀這篇文章為 Nginx 新增 HTTP 基本認證(HTTP Basic Authentication)
(10)Nginx如何配置超時時間?
proxy_send_timeout 90; #後端伺服器資料回傳時間(代理髮送超時) proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)
(11)Nginx請求體過大怎麼辦?
這種場景通常出現在Nginx代理後端服務中。問題的報錯資訊如下:
413 Request Entity Too Large
解決辦法配置如下即可:
client_max_body_size 20m;
(12)Nginx如何配置負載均衡?
Nginx負載均衡有六種策略,分別是輪詢、權重、ip_hash、最少連線、fair、url_hash等)。
(1)輪詢策略
upstream backup-server { server 192.168.1.101:8080; server 192.168.1.102:8080; }
(2)權重策略
upstream backup-server { server 192.168.1.101:8080 weigh=5; server 192.168.1.102:8080 weigh=6; }
(3)ip_hash策略
upstream backup-server { ip_hash; server 192.168.1.101:8080 weigh=5; server 192.168.1.102:8080 weigh=6; }
(4)最少連線策略
upstream backup-server { least_conn; server 192.168.1.101:8080 weigh=5; server 192.168.1.102:8080 weigh=6; }
(5)fair策略
upstream backup-server { server 192.168.1.101:8080; server 192.168.1.102:8080; fair; }
(6)url_hash策略
upstream backup-server { hash $request_uri; server 192.168.1.101:8080; server 192.168.1.102:8080; }
八、Nginx的安全策略需要從哪些方面考慮?
1.隱藏Nginx版本資訊,防止對應的攻擊者通過版本漏洞來攻擊
server_tokens off;
2.限制HTTP請求方式
HTTP請求一共有九種,分別為GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT等。
這裡我僅僅只允許GET與POST:
if ($request_method !~ ^(GET|POST)$ ) { return 404; }
3.自定義Nginx快取
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伺服器傳
4.過濾非法USER-AGENT(簡稱UA)
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) { return 403; }
5.過濾不支援URL
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ { rewrite ^/(.*)$ $host permanent; }
6.強制域名訪問(必須開啟SSL保護)
if ( $host !~* 'youcongtech.com' ) { return 403; }
7.使用者降低許可權
user nginx www;
8.禁止目錄瀏覽
autoindex off;
9.限制檔案上傳大小
client_max_body_size 18m
10.關注Nginx所使用版本的漏洞情況,並適時更新
關於Nginx相關版本資訊可訪問如下網址獲取(Nginx下載地址):
https://nginx.org/en/download.html
當然了,這僅僅是從Nginx的安全形度出發,光從Nginx出發只能在一定程度上保障Nginx本身的安全,還是得從伺服器層面乃至制度層面入手。伺服器層面我曾寫過一些文章,可供讀者朋友參考:
伺服器安全策略之思考與實踐
九、Nginx架構是怎樣的?
1.Nginx架構設計的核心主要包含哪些方面?
由圖可知,架構設計的核心主要體現如下:
- (1)模組化設計。
- (2)代理設計。
- (3)事件驅動模型。
- (4)主程式模型。
- (5)工作程式模型。
2.Nginx啟動流程是怎樣的?
3.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架構,明確架構核心、啟動流程、原始碼目錄的含義等(讀者朋友可根據自己需要進行查閱相關資料並深入學習實踐等)。