Nginx服務器是一款高性能的服務器,之前部署網站就使用了它進行反向代理,這次就好好總結Nginx相關的特性與使用。
01 前言
Nginx服務器是Web服務器,也就是我們平時用來提供Web服務的。我們之前可能聽過Apache、Tomcat、IIS等的服務器,其實Nginx和它們都是一樣的,都可以通過HTTP為瀏覽器等客戶端提供各種服務。
Nginx服務器是一個跨平臺的服務器,可以運行在Window和linux以及mac OS等操作系統,它的特點就是可以處理大規模的并發連接。接下來就具體介紹一下。
02 正向代理與反向代理
- 正向代理,代理客戶端,服務端不知道實際發起請求的客戶端;
- 反向代理,代理服務端,客戶端不知道實際提供服務的服務端;
比如我們訪問google.com的時候,是通過正向代理的方式,谷歌服務器是不知道是哪個用戶對它進行訪問,這就是正向代理;但是假如谷歌服務器壓力大,承受不了這么多人訪問,用戶的請求就會分發到不同的谷歌服務器,用戶不知道自己請求的具體是哪一臺服務器,這就是反向代理。
「正向代理」
「反向代理」
03 Nginx
「Nginx特點」
- 響應快
- 擴展性強
- 可靠性高
- 內存消耗少
- 支持高并發
- 熱部署
- 免費開源
「Nginx的使用」
我們要為了能夠方便地使用Nginx,一般我們都會將它安裝在Linux系統上面。所以我們現在服務器上面安裝Nginx,只需一行代碼就搞定。默認情況之下,nginx會安裝在 /etc/nginx目錄之下,其中nginx.conf是它的配置文件。
yum install nginx
我們有必要了解一下nginx相關的命令,我們經常會使用,比如啟動停止、查看狀態等。
- 啟動
systemctl start nginx
- 停止
systemctl stop nginx
- 重啟
systemctl restart nginx systemctl status nginx
- 狀態
systemctl status nginx nginx -v
- 版本
nginx -v
- 測試
nginx -t
「Nginx進程」
Nginx服務器一般都是使用一個master主進程管理多個worker進程的,而worker進程一般與服務器CPU的核數相等。
master進程是不提供服務的,真正提供服務的是worker進程,worker進程之間通過進程間通信機制實現通信,如負載均衡等。假如worker某進程出錯,其余進程將不受影響繼續提供服務,master進程也會啟動一個新的進程。
「nginx.conf」
nginx的默認配置文件一共有以下幾塊,分別配置不同的信息。
user nginx; #配置用戶或者組,默認為nginx。
worker_processes 2; #允許生成的進程數,默認為1
pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址
error_log log/error.log debug; #制定日志路徑,級別。級別可為:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #設置網路連接序列化,防止驚群現象發生,默認為on
multi_accept on; #設置一個進程是否同時接受多個網絡連接,默認為off
use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大連接數,默認為512
}
http {
include mime.types; #文件擴展名與文件類型映射表
default_type Application/octet-stream; #默認文件類型,默認為text/plain
#access_log off; #取消服務日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
access_log log/access.log myFormat; #combined為日志格式的默認值
sendfile on; #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。
sendfile_max_chunk 100k; #每個進程每次調用傳輸數量不能大于設定的值,默認為0,即不設上限。
keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #熱備
}
error_page 404 https://www.baidu.com; #錯誤頁
server {
keepalive_requests 120; #單連接請求上限次數。
listen 80; #監聽端口
server_name 127.0.0.1; #監聽地址
location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。
#root path; #根目錄
#index vv.txt; #設置默認頁
proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器列表
deny 127.0.0.1; #拒絕的ip
allow 172.18.5.54; #允許的ip
}
}
}
- 全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。
- events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。
- http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
- server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
- location塊:配置請求的路由,以及各種頁面的處理情況。
「反向代理」
反向代理用于接收網絡上的請求,然后將請求轉發到目標服務器,然后目標服務器返回給代理服務器,最后返回給用戶。此方法延長了請求時間,但是降低了目標服務器的壓力。
反向代理的基本配置:
- proxy_pass:將請求代理到當前的服務器,可以是主機名/IP地址+端口形式
- proxy_methods:表示轉發時的協議方法名,如get/post等
- proxy_hide_header:指定目標服務器返回給代理服務器的響應中,代理決定哪些頭不轉發給客戶端,值為響應頭
- proxy_pass_header:與上面相反,表示哪些頭允許轉發給客戶端
- proxy_pass_request_body:是否向目標服務器發送HTTP包實體部分,值為on/off
- proxy_pass_request_headers:是否向目標服務器發送HTTP頭,值為on/off
- proxy_redirect:如目標服務器返回301/302重定向,那么就會重設location或者refresh字段
proxy_redirect http://localhost:8000/two/
http://frontend;
如果請求http://localhost:8000/two/uri/在返回重定向的情況下,實際上轉發給客戶端的就是http://frontend/uri,值為off則將使location或者refresh字段維持不變
- proxy_next_upstream:表示目標服務器轉發請求發生錯誤,換一臺目標服務器處理這個請求
「負載均衡」
實現負載均衡最關鍵的模塊就是upstream模塊,服務器就寫在里面的server字段,對應著不同的服務器。
http {
upstream test {
server xx.xxx.xxx.xx weight:5;
server xx.xx.xx.xx max_fails=3 fail_timeout=30s;
}
server {
listen 8080;
location / {
proxy_pass http://test;
}
}
}
這里的意思就是當你請求根路徑的時候就會代理到upstream里面的兩個服務器,以此來實現負載均衡的功能。
「server」配置選項:
- weight:向這臺服務器轉發的權重,默認是1
- max_fails:與fail_timeout配合使用,如果在fail_timeout時間內的轉發次數超過max_fails的數量,代表該服務器不可用。max_fails默認是1,設為0則不檢查次數
- dowm:服務器下線,只會在ip_hash配置項時才有用
- backup:表示該服務器只是備份的,當其他的服務器失效之后才轉發給它,有ip_hash配置項時無效
「upstream」配置選項:
- ip_hash:解決同一用戶在不同的服務器中緩存相同的信息,與weight不可同時使用
http {
upstream test {
ip_hash;
server xx1.xxx.xxx.xx;
server xx2.xx.xx.xx;
server xx3.xx.xx.xx;
}
server {
listen 8080;
location / {
proxy_pass http://test;
}
}
}
04 小結
通過對Nginx服務器的一些理解,會讓我們知道一些網絡上的知識,如正向代理與反向代理的區別、負載均衡的實現等。
大家也可以嘗試著使用nginx服務器進行一些配置,上面只是一些簡單的配置模塊,如果想要詳情的理解去官網看一下。對于前端來說,懂基本的就可以,不用像運維那樣精通所有的配置,當然學有余力最好不過了,奈何自己學習能力有限,以后再詳解其中的一二。