Nginx背景和概述
Nginx(發音同 engine x)是一款基於異步框架的輕量級/高性能由C語言的Web 服務器/反向代理服務器/緩存服務器/電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev(伊戈爾·賽索耶夫)所開發,最初供俄國大型網站Rambler.ru及搜尋引擎Rambler使用。
同Apache 一樣都是一種WEB 服務器,基於REST 架構風格,以統一資源描述符(Inform Resources ldentifier )URI 或者統一資源定位符(Uniform Resources Locator )URL 作為溝通依據,通HTTP 協議提供各種網絡服務。Apache 的發展時期很長。而目是毫無爭議的世界第一大服務器,它有著很多優點:穩定、開源、跨平臺等等,它出現的時間太長了,它興起的年代,互聯網產業遠近比不上現在。所以它被設計為一個重量級的它不支持高併發的服務器,在Apache 上運行數以萬計的井發訪問,會導致服務器消耗大量內存,操作系統其進行進程或線程間的切換也消耗了大量的CPU 圖源,導致HTTP 請求的平均響應速度降低。這些都決定了Apache 不可能成為高性能WEB 服務器,輕量圾高井發服務器Nginx 就應運而生了。
Nginx特點
優點:
- 高併發量:基於 epoll/kqueue 模型開發,支持高併發量,官方說其支持高達 5w 併發連接數的響應。
- 內存消耗少:善於處理靜態文件,相較於其他web(比如:apache),佔用更少的內存及資源。
- 簡單穩定:配置簡單(一個conf文件),運行簡單(nginx命令),而且運行穩定。
- 節省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存的Hedear頭
- 內置健康檢查:如果nginx後端有服務區宕機了,不影響前端訪問,能自動監測服務狀態
- 模塊化程度高:功能模塊插件化設計,可以自由配置相應的功能。
- 支持Rwrite重寫規則:能夠根據域名、URL等請求關鍵點,實現定製化的高質量分發。
- 低成本:Nginx的負載均衡功能很強大而且免費開源,相較於幾十萬的硬件負載均衡器成本相當低。
- 支持多系統:Nginx代碼完全用C語言從頭寫成,可以在各系統上編譯並使用。
缺點:
- 動態處理差:nginx善於處理靜態文件,但是處理動態頁面相較於Apache之類重量級的web軟件能力稍欠缺。
- rewrite弱:雖然nginx支持rewrite功能多,但是相較於Apache之類重量級的web軟件能力稍欠缺。
Nginx安裝
安裝(Ubuntu為例)
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-devapt-get install nginx -y
檢查效果
netstat -tnulp | grep nginx
服務相關命令
# 啟動停止systemctl start|stop|reload|... nginx/etc/init.d/nginx start|stop|reload|.../usr/sbin/nginx ... -s stop|reload# 查看信息nginx -Vnginx -v# 檢查配置文件nginx -t # 檢查默認配置文件nginx -t -c file.conf # 指定配置文件進行檢查
移除相關命令
# 查看和nginx相關軟件dpkg --get-selections|grep nginx# 移除nginx,包括相關文件apt-get --purge remove nginxapt-get --purge remove nginx-commonapt-get --purge remove nginx-core
Nginx配置
相關目錄
Windows:
1.conf目錄:存放配置文件的目錄,包含主配置文件nginx.conf,是我們經常修改的配置文件。2.contrib目錄:存放開源愛好者共享的代碼。3.docs目錄:存放文檔資料。4.html目錄:默認存放了Nginx的錯誤頁面和歡迎頁面。5.logs目錄:默認存放了訪問日誌、錯誤日誌和Nginx主進程pid文件。6.temp目錄:臨時目錄,用於存放Nginx運行時產生的臨時文件。7.nginx.exe:可執行程序,常用於Nginx服務的啟動、停止等管理工作。
linux:
1.*_temp目錄:共有5個temp結尾的目錄,用於存放Nginx運行時產生的臨時文件。2.conf目錄:存放配置文件的目錄,包含主配置文件nginx.conf,是我們經常修改的配置文件。3.html目錄:默認存放了Nginx的錯誤頁面和歡迎頁面等。4.logs目錄:默認存放了訪問日誌和錯誤日誌文件。5.sbin目錄:默認存放了Nginx的二進制命令,常用於Nginx服務的啟動、停止等管理工作。
配置文件
默認文件:/etc/nginx/nginx.conf其他目錄:/etc/nginx/{sites-enabled/conf.d}文件結構: 全局配置段 http配置段 server配置段 # 項目或者應用 location配置段 # url配置
nginx配置詳解
- 全局配置段
主要是全局性的和服務級別的屬性配置,常見的主要有以下幾種設置:
user # 設置使用用戶(worker)worker_processes # 進行增大併發連接數的處理 跟cpu保持一致 八核設置八個pid # nginx服務啟動時候pidevents # 定義事件相關的屬性 worker_connections # 一個進程允許處理的最大連接數 use # 定義使用的內核模型
- http配置段
主要配置server通用的一些配置:
include mime.types; # 文件擴展名與文件類型映射表default_type application/octet-stream; # 默認文件類型sendfile on; # 開啟高效文件傳輸模式。autoindex on; # 開啟目錄列表訪問,合適下載服務器,默認關閉。tcp_nopush on; # 防止網絡阻塞tcp_nodelay on; # 防止網絡阻塞keepalive_timeout 120; # 長連接超時時間,單位是秒gzip on; # 開啟gzip壓縮輸出
- server配置段
常見樣式:
server { listen :; server_name ; ...}
1.listen屬性:
作用:定義server監聽的ip和port,當ip和port匹配時候才進行下一步匹配。
2.server_name屬性:
作用:定義server監聽的域名,當域名匹配時候才進行下一步操作。
3.root屬性:
作用:定義客戶端請求的html文件所在目錄路徑。表現形式:root /var/www/html;
4.index屬性
作用:定義客戶端請求時默認返回的文件。表現形式:index index.html index.htm index.nginx-debian.html;
- location配置段
location主要是根據server匹配到的請求路徑去處理和響應。 根據請求完整url,獲取uri(即:除了域名(IP)、Port和路徑參數之外的部分),用於location匹配。
匹配規則:
匹配優先級:精確匹配>location 完整路徑>優先匹配>正則匹配>location 部分路徑>通用匹配
匹配示例:
location = / { location ~ \\.(gif|jpg|png|js|css)$ { #精確規則A #正則規則D} }location = /login { location ~* \\.png$ { #精確規則B #正則規則E} }location ^~ /static/ { location / { #優先規則C #通用規則F} }
location核心動作:響應時按順序查找file,找到則返回file內容,否則的話進行內部重定向(uri)或返回狀態碼(code)。
常見示例:
# 如果能找到指定的uri那麼就返回相應的內容,否則的話返回錯誤狀態碼404location / { try_files $uri $uri/ =404;}# 如果能找到指定的文件1/2.html那麼就返回相應的內容,否則的話返回6.html文件內容location / { try_files 1.html 2.html /6.html;}# 如果能找到指定的uri那麼就返回相應的內容,否則的話就內部重定向到後端名稱為@backup的locationlocation / { try_files $uri @backup;}location @backup { # ...do something}
location常見操作:
1)基本屬性
location / { # 指定響應請求的文件所在路徑 root /var/www/html; # 指定響應請求的默認文件名稱 index index.php index.html index.htm; # 指定響應請求的文件瀏覽器緩存過期時間,一般用於靜態文件 expires 7d; # 如果root指定的路徑下有查找的文件,就返回,否則報404 try_files $uri $uri/ =404; }
2)臨時跳轉
location = /test/ { return 302 http://www.itcast.cn/;}
3)目錄列表
location /upload { # 指定查看文件列表路徑(絕對路徑) alias /var/www/upload/; # 開啟目錄自動索引 autoindex on; # 默認on,顯示文件確切大小(bytes)。off表示顯示文件的大概大小(kB/MB/...) autoindex_exact_size off; # 默認off,顯示的文件時間為GMT時間。on表示顯示文件的服務器時間 autoindex_localtime on; }
- 其他說明
1)root VS alias
root 和 alias 所起的作用都是指定響應請求文件所在的路徑,只是它們有區別。
root 表示 location 匹配內容的相對路徑alias 表示 一個絕對路徑。
一般情況下,在location /中配置root,在location /other中配置alias。
效果一: 效果二:location /txt/ { location /txt/ { alias /var/www/txt/; root /var/www/txt/;} }
效果一:訪問http://localhost/txt/1.txt,nginx找/var/www/txt/1.txt文件效果二:訪問http://localhost/txt/1.txt,nginx找/var/www/txt/txt/1.txt文件
2)關於URL尾部的/有如下注意事項
* location中的location_match字符有無"/"不受影響,/user/等同/user。* 對於訪問網站域名(http://www.smartli.cn/),尾部有無"/"不受影響,因為瀏覽器會自動補全"/"。* 對於訪問網站域名後面的路徑(http://www.smartli.cn/other/),尾部的"/"很重要。
訪問URL尾部的"/"表示目錄,沒有"/"表示文件,而且文件找不到的話,會發生重定向。
* /other/:表示服務器會自動去該目錄下找對應的默認文件。* /other:表示服務器會先去找other文件,找不到的話會將other當成目錄,重定向到/other/,去該目錄下找默認文件。
Nginx反向代理
代理是什麼?
簡單來說,我找一箇中間人,代替我去做一件事情,只要他給我結果就可以。代理一般分為兩種:正向代理和反向代理。
區別:
1)從用途上來講
- 正向代理-為局域網客戶端向外訪問Internet服務,可以使用緩衝特性減少網絡使用率。
- 反向代理-為局域網服務器向外提供Internet服務,可以使用負載平衡提高客戶訪問量,還可以基於高級URL策略和管理技術對服務進行高質量管控。
2)從安全性來講
- 正向代理-必須採取安全措施確保內網客戶端通過它訪問外部網站,隱藏客戶端的身份。
- 反向代理-對外提供服務是透明的,客戶端並不知道自己訪問的是一個代理,隱藏服務端的身份。
nginx代理配置說明
示例:
location / { # 設定請求跳轉後的地址,可以使用hostname或ip:port形式 proxy_pass http://localhost:8000; }
proxy_pass指令設置被代理服務器的地址和被映射的URI,地址可以使用主機名或IP加端口號的形式。
Nginx負載均衡
上一小節我們使用proxy_pass的方式實現了nginx代理請求到後端服務器的效果,隨著我們的網站訪問量越來越多,一個後端服務器就不現實了,那麼接下來如何在訪問量日漸增大的情況下,滿足線上業務的穩定呢?解決方法就是:負載均衡。
基本配置
示例:
upstream backends { server [域名|ip]:port; server [域名|ip]:port; server [域名|ip]:port; ...}server { location / { proxy_pass http://backends; }}
負載均衡策略
Nginx提供的負載均衡策略有兩種:
內置策略:nginx自帶的算法
- 雨露均霑型:輪訓、加權輪訓、哈希
- 定向服務型:ip_hash、least_conn、cookie、route、lean
- 商業類型:ntlm、least_time、queue、stick
擴展策略:各種結合業務場景自定義的算法或者第三方算法
- 自定義算法
- 第三方算法:fair、url_hash
常用算法簡介
- 輪詢(默認):請求按順序逐一分配到不同的後端服務器。
- weight:指定輪詢權重,值越大,分配到的幾率就越高,適用於後端服務器性能不均衡情況。
- ip_hash:按訪問IP的哈希結果分配請求,分配後客戶端訪問固定後端服務器,有效的解決動態網頁會話共享問題。
- fair:基於後端服務器的響應時間來分配請求,響應時間短的優先分配。
- url_hash:按訪問URL的哈希結果分配請求,使同一URL定向到同一臺後端服務器,可提高後端緩存服務器的效率。
加權輪訓示例:
# vim /etc/nginx/conf.d/upstream.confupstream backends { server 172.16.179.130:10086 backup; server 172.16.179.130:10087 weight=1; server 172.16.179.130:10088 weight=2;}...
ip_hash示例:
# vim /etc/nginx/conf.d/upstream.confupstream backends { ip_hash; server 172.16.179.130:10086; ...}...
日誌解析
通過對日誌文件的分析,可以為網站運營和維護提供相應的數據支持,最常見的場景就是獲取客戶端的IP,記錄用戶訪問量。
Nginx默認提供了兩個日誌文件 access.log和error.log。
- access.log:可以得到用戶請求的相關信息;
- error.log:可以獲取某個web服務故障或其性能瓶頸等信息。
1)基本配置
# cat /etc/nginx/nginx.confaccess_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;
2)默認日誌格式
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
自定義日誌
1)設置日誌格式
# vim /etc/nginx/nginx.conf# Logging Settings## 設定日誌格式的方法: log_format 格式名稱 "日誌表現樣式"log_format proxy_format '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
2)使用日誌格式
access_log 日誌路徑 格式名稱;
學完以上的配置,你就基本上可以使用Nginx配置一個簡單的比如博客網站,自己買一個服務器然後安裝Nginx配置一下文件,把你的博客文件放到指定目錄下,然後訪問你服務器對應的地址和端口就可以輕鬆的看到你的博客啦,快去嘗試吧!
當然,Nginx用在大廠上面是需要更多的配置的,以滿足高併發下的需求。
作者簡介:Python菜鳥工程師,將在接下來的一段時間內與大家分享一些與Python相關的知識點。如若文中出現問題,各位大佬多多指點,互相學習。喜歡的關注一個吧!謝謝!
閱讀更多 大鬍子網絡 的文章