nginx是一款自由的、開源的、高性能的http服務器和反向代理服務器;同時也是一個imap、pop3、smtp代理服務器;nginx可以作為一個http服務器進行網站的發布處理,另外nginx可以作為反向代理進行負載均衡的實現。
這里主要通過三個方面簡單介紹nginx
反向代理負載均衡 nginx特點 1. 反向代理
關于代理
說到代理,首先我們要明確一個概念,所謂代理就是一個代表、一個渠道;
此時就設計到兩個角色,一個是被代理角色,一個是目標角色,被代理角色通過這個代理訪問目標角色完成一些任務的過程稱為代理操作過程;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是adidas廠家,目標角色就是用戶
正向代理
說反向代理之前,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式,我們會從兩個方面來說關于正向代理的處理模式,分別從軟件方面和生活方面來解釋一下什么叫正向代理
在如今的網絡環境下,我們如果由于技術需要要去訪問國外的某些網站,此時你會發現位于國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作fq進行訪問,fq的方式主要是找到一個可以訪問國外網站的代理服務器,我們將請求發送給代理服務器,代理服務器去訪問國外的網站,然后將訪問到的數據傳遞給我們!
上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的服務器地址;服務器只清楚請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
反向代理
明白了什么是正向代理,我們繼續看關于反向代理的處理方式,舉例如我大天朝的某寶網站,每天同時連接到網站的訪問人數已經爆表,單個服務器遠遠不能滿足人民日益增長的購買欲望了,此時就出現了一個大家耳熟能詳的名詞:分布式部署;也就是通過部署多臺服務器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用nginx進行反向代理實現的,并且通過封裝nginx和其他的組件之后起了個高大上的名字:tengine
那么反向代理具體是通過什么樣的方式實現的分布式的集群操作呢,我們先看一個示意圖:
通過上述的圖解大家就可以看清楚了,多個客戶端給服務器發送的請求,nginx服務器接收到之后,按照一定的規則分發給了后端的業務處理服務器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪臺服務器處理的并不明確了,nginx扮演的就是一個反向代理角色
反向代理,主要用于服務器集群分布式部署的情況下,反向代理隱藏了服務器的信息!
項目場景
通常情況下,我們在實際項目操作時,正向代理和反向代理很有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標服務器,目標服務器是一個反向單利服務器,反向代理了多臺真實的業務處理服務器。具體的拓撲圖如下:
?
2. 負載均衡
我們已經明確了所謂代理服務器的概念,那么接下來,nginx扮演了反向代理服務器的角色,它是以依據什么樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否可以控制呢?
這里提到的客戶端發送的、nginx反向代理服務器接收到的請求數量,就是我們說的負載量
請求數量按照一定的規則進行分發到不同的服務器處理的規則,就是一種均衡規則
所以~將服務器接收到的請求按照規則分發的過程,稱為負載均衡。
負載均衡在實際項目操作過程中,有硬件負載均衡和軟件負載均衡兩種,硬件負載均衡也稱為硬負載,如f5負載均衡,相對造價昂貴成本較高,但是數據的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司才會選擇硬負載進行操作;更多的公司考慮到成本原因,會選擇使用軟件負載均衡,軟件負載均衡是利用現有的技術結合主機硬件實現的一種消息隊列分發機制
nginx支持的負載均衡調度算法方式如下:
weight輪詢(默認):接收到的請求按照順序逐一分配到不同的后端服務器,即使在使用過程中,某一臺后端服務器宕機,nginx會自動將該服務器剔除出隊列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的后端服務器設置一個權重值(weight),用于調整不同的服務器上請求的分配率;權重數據越大,被分配到請求的幾率越大;該權重值,主要是針對實際工作環境中不同的后端服務器硬件配置進行調整的。
ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的算法下一個固定ip地址的客戶端總會訪問到同一個后端服務器,這也在一定程度上解決了集群部署環境下Session共享的問題。
fair:智能調整調度算法,動態的根據后端服務器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的服務器分配到請求的概率高,響應時間長處理效率低的服務器分配到的請求少;結合了前兩者的優點的一種調度算法。但是需要注意的是nginx默認不支持fair算法,如果要使用這種調度算法,請安裝upstream_fair模塊
url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向后端固定的某個服務器,可以在nginx作為靜態服務器的情況下提高緩存效率。同樣要注意nginx默認不支持這種調度算法,要使用的話需要安裝nginx的hash軟件包
nginx安裝 1. windows安裝
官方網站下載地址:
https://nginx.org/en/download.html
如下圖所示,下載對應的版本的nginx壓縮包,解壓到自己電腦上存放軟件的文件夾中即可
解壓完成后,文件目錄結構如下:
??
啟動nginx
1) 直接雙擊該目錄下的nginx.exe,即可啟動nginx服務器
2) 命令行計入該文件夾,執行nginx命令,也會直接啟動nginx服務器
d:/resp_application/nginx-1.13.5>?nginx
?
訪問nginx
打開瀏覽器,輸入地址:http://localhost,訪問頁面,出現如下頁面表示訪問成功
?
停止nginx
命令行進入nginx根目錄,執行如下命令,停止服務器:
#?強制停止nginx服務器,如果有未處理的數據,丟棄 d:/resp_application/nginx-1.13.5>?nginx?-s?stop #?優雅的停止nginx服務器,如果有未處理的數據,等待處理完成之后停止 d:/resp_application/nginx-1.13.5>?nginx?-s?quit
?
2. ubuntu安裝
按照正常軟件的安裝方式,直接通過如下命令進行安裝:
$?sudo?apt-get?install?nginx
安裝完成即可,在/usr/sbin/目錄下是nginx命令所在目錄,在/etc/nginx/目錄下是nginx所有的配置文件,用于配置nginx服務器以及負載均衡等信息
查看nginx進程是否啟動
$?ps?-ef|grep?nginx
nginx會自動根據當前主機的cpu的內核數目創建對應的進程數量(當前ubuntu主機是2核4線程配置)
備注:這里啟動的服務進程其實是4個進程,因為nginx進程在啟動的時候,會附帶一個守護進程,用于保護正式進程不被異常終止;如果守護進程一旦返現nginx繼承被終止了,會自動重啟該進程。
守護進程一般會稱為master進程,業務進程被稱為worker進程
? 啟動nginx服務器命令
直接執行nginx會按照默認的配置文件進行服務器的啟動
$?nginx
?? 停止
nginx服務命令
和windows系統執行過程一樣,兩種停止方式
$?nginx?-s?stop or $?nginx?-s?quit
?
重新啟動加載
同樣也可以使用命令reopen和reload來重新啟動nginx或者重新加載配合著文件。
3. mac os安裝
直接通過brew進行nginx的安裝,或者下載tar.gz壓縮包都是可以的。
直接通過brew進行安裝
brew?install?nginx
安裝完成后,后續的命令操作,服務器的啟動、進程查看、服務器的停止、服務器的重啟已經文件加載命令都是一致的。
nginx配置
nginx是一個功能非常強大的web服務器加反向代理服務器,同時又是郵件服務器等等
在項目使用中,使用最多的三個核心功能是反向代理、負載均衡和靜態服務器
這三個不同的功能的使用,都跟nginx的配置密切相關,nginx服務器的配置信息主要集中在nginx.conf這個配置文件中,并且所有的可配置選項大致分為以下幾個部分
main????????????????#?全局配置 Events?{??????????????#?nginx工作模式配置 } http?{????????????????#?http設置 .... server?{????????????#?服務器主機配置 .... location?{??????????#?路由配置 .... } location?path?{ .... } location?otherpath?{ .... } } server?{ .... location?{ .... } } upstream?name?{??????????#?負載均衡配置 .... } }
如上述配置文件所示,主要由6個部分組成:
main:用于進行nginx全局信息的配置 events:用于nginx工作模式的配置 http:用于進行http協議信息的一些配置 server:用于進行服務器訪問信息的配置 location:用于進行訪問路由的配置 upstream:用于進行負載均衡的配置 main模塊
觀察下面的配置代碼
#?user?nobody?nobody; worker_processes?2; #?Error_log?logs/error.log #?error_log?logs/error.log?notice #?error_log?logs/error.log?info #?pid?logs/nginx.pid worker_rlimit_nofile?1024;
上述配置都是存放在main全局配置模塊中的配置項
user用來指定nginx worker進程運行用戶以及用戶組,默認nobody賬號運行 worker_processes指定nginx要開啟的子進程數量,運行過程中監控每個進程消耗內存(一般幾m~幾十m不等)根據實際情況進行調整,通常數量是cpu內核數量的整數倍 error_log定義錯誤日志文件的位置及輸出級別【debug / info / notice / warn / error / crit】 pid用來指定進程id的存儲文件的位置 worker_rlimit_nofile用于指定一個進程可以打開最多文件數量的描述 event 模塊
上干貨
event?{ worker_connections?1024; multi_accept?on; use?epoll; }
上述配置是針對nginx服務器的工作模式的一些操作配置
worker_connections 指定最大可以同時接收的連接數量,這里一定要注意,最大連接數量是和worker processes共同決定的。 multi_accept 配置指定nginx在收到一個新連接通知后盡可能多的接受更多的連接 use epoll 配置指定了線程輪詢的方法,如果是linux2.6+,使用epoll,如果是bsd如mac請使用kqueue http模塊
作為web服務器,http模塊是nginx最核心的一個模塊,配置項也是比較多的,項目中會設置到很多的實際業務場景,需要根據硬件信息進行適當的配置,常規情況下,使用默認配置即可!
http?{ ## #?基礎配置 ## sendfile?on; tcp_nopush?on; tcp_nodelay?on; keepalive_timeout?65; types_hash_max_size?2048; #?server_tokens?off; #?server_names_hash_bucket_size?64; #?server_name_in_redirect?off; include?/etc/nginx/mime.types; default_type?application/octet-stream; ## #?ssl證書配置 ## ssl_protocols?tlsv1?tlsv1.1?tlsv1.2;?#?dropping?sslv3,?ref:?poodle ssl_prefer_server_ciphers?on; ## #?日志配置 ## access_log?/var/log/nginx/access.log; error_log?/var/log/nginx/error.log; ## #?gzip?壓縮配置 ## gzip?on; gzip_disable?"msie6"; #?gzip_vary?on; #?gzip_proxied?any; #?gzip_comp_level?6; #?gzip_buffers?16?8k; #?gzip_http_version?1.1; #?gzip_types?text/plain?text/css?application/json?application/javascript text/xml?application/xml?application/xml+rss?text/javascript; ## #?虛擬主機配置 ## include?/etc/nginx/conf.d/*.conf; include?/etc/nginx/sites-enabled/*;
1) 基礎配置
sendfile?on:配置on讓sendfile發揮作用,將文件的回寫過程交給數據緩沖去去完成,而不是放在應用中完成,這樣的話在性能提升有有好處 tc_nopush?on:讓nginx在一個數據包中發送所有的頭文件,而不是一個一個單獨發 tcp_nodelay?on:讓nginx不要緩存數據,而是一段一段發送,如果數據的傳輸有實時性的要求的話可以配置它,發送完一小段數據就立刻能得到返回值,但是不要濫用哦 keepalive_timeout?10:給客戶端分配連接超時時間,服務器會在這個時間過后關閉連接。一般設置時間較短,可以讓nginx工作持續性更好 client_header_timeout?10:設置請求頭的超時時間 client_body_timeout?10:設置請求體的超時時間 send_timeout?10:指定客戶端響應超時時間,如果客戶端兩次操作間隔超過這個時間,服務器就會關閉這個鏈接 limit_conn_zone?$binary_remote_addr?zone=addr:5m?:設置用于保存各種key的共享內存的參數, limit_conn?addr?100:?給定的key設置最大連接數 server_tokens:雖然不會讓nginx執行速度更快,但是可以在錯誤頁面關閉nginx版本提示,對于網站安全性的提升有好處哦 include?/etc/nginx/mime.types:指定在當前文件中包含另一個文件的指令 default_type?application/octet-stream:指定默認處理的文件類型可以是二進制 type_hash_max_size?2048:混淆數據,影響三列沖突率,值越大消耗內存越多,散列key沖突率會降低,檢索速度更快;值越小key,占用內存較少,沖突率越高,檢索速度變慢
2) 日志配置
access_log?logs/access.log:設置存儲訪問記錄的日志 error_log?logs/error.log:設置存儲記錄錯誤發生的日志
3) ssl證書加密
ssl_protocols:指令用于啟動特定的加密協議,nginx在1.1.13和1.0.12版本后默認是ssl_protocols?sslv3?tlsv1?tlsv1.1?tlsv1.2,tlsv1.1與tlsv1.2要確保openssl?>=?1.0.1?,sslv3?現在還有很多地方在用但有不少被攻擊的漏洞。 ssl?prefer?server?ciphers:設置協商加密算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件
4) 壓縮配置
gzip?是告訴nginx采用gzip壓縮的形式發送數據。這將會減少我們發送的數據量。 gzip_disable?為指定的客戶端禁用gzip功能。我們設置成ie6或者更低版本以使我們的方案能夠廣泛兼容。 gzip_static?告訴nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被注釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這里)。 gzip_proxied?允許或者禁止壓縮基于請求和響應的響應流。我們設置為any,意味著將會壓縮所有的請求。 gzip_min_length?設置對數據啟用壓縮的最少字節數。如果一個請求小于1000字節,我們最好不要壓縮它,因為壓縮這些小的數據會降低處理此請求的所有進程的速度。 gzip_comp_level?設置數據的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。我們設置為4,這是一個比較折中的設置。 gzip_type?設置需要壓縮的數據格式。上面例子中已經有一些了,你也可以再添加更多的格式。
5) 文件緩存配置
open_file_cache?打開緩存的同時也指定了緩存最大數目,以及緩存的時間。我們可以設置一個相對高的最大時間,這樣我們可以在它們不活動超過20秒后清除掉。 open_file_cache_valid?在open_file_cache中指定檢測正確信息的間隔時間。 open_file_cache_min_uses?定義了open_file_cache中指令參數不活動時間期間里最小的文件數。 open_file_cache_errors?指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。我們也包括了服務器模塊,這些是在不同文件中定義的。如果你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。
server模塊
srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務器的配置信息
server?{ listen????80; server_name?localhost??192.168.1.100; root????/nginx/www; index????index.php?index.html?index.html; charset????utf-8; access_log??logs/access.log; error_log??logs/error.log; ...... }
核心配置信息如下:
server:一個虛擬主機的配置,一個http中可以配置多個server
server_name:用力啊指定ip地址或者域名,多個配置之間用空格分隔
root:表示整個server虛擬主機內的根目錄,所有當前主機中web項目的根目錄
index:用戶訪問web網站時的全局首頁
charset:用于設置www/路徑中配置的網頁的默認編碼格式
access_log:用于指定該虛擬主機服務器中的訪問記錄日志存放路徑
error_log:用于指定該虛擬主機服務器中訪問錯誤日志的存放路徑
location模塊
location模塊是nginx配置中出現最多的一個配置,主要用于配置路由訪問信息
在路由訪問信息配置中關聯到反向代理、負載均衡等等各項功能,所以location模塊也是一個非常重要的配置模塊
基本配置
location?/?{ root??/nginx/www; index??index.php?index.html?index.htm; }
location /:表示匹配訪問根目錄
root:用于指定訪問根目錄時,訪問虛擬主機的web目錄
index:在不指定訪問具體資源時,默認展示的資源文件列表
反向代理配置方式
通過反向代理代理服務器訪問模式,通過proxy_set配置讓客戶端訪問透明化
location?/?{ proxy_pass?http://localhost:8888; proxy_set_header?x-real-ip?$remote_addr; proxy_set_header?host?$http_host; }
uwsgi配置
wsgi模式下的服務器配置訪問方式
location?/?{ include?uwsgi_params; uwsgi_pass?localhost:8888 }
upstream模塊
upstream模塊主要負責負載均衡的配置,通過默認的輪詢調度方式來分發請求到后端服務器
簡單的配置方式如下
upstream?name?{ ip_hash; server?192.168.1.100:8000; server?192.168.1.100:8001?down; server?192.168.1.100:8002?max_fails=3; server?192.168.1.100:8003?fail_timeout=20s; server?192.168.1.100:8004?max_fails=3?fail_timeout=20s; }
核心配置信息如下
ip_hash:指定請求調度算法,默認是weight權重輪詢調度,可以指定
server host:port:分發服務器的列表配置
— down:表示該主機暫停服務
— max_fails:表示失敗最大次數,超過失敗最大次數暫停服務
— fail_timeout:表示如果請求受理失敗,暫停指定的時間之后重新發起請求