文章目錄
一、簡介
Nginx (engine x) 是一個高性能的Web服務器和反向代理服務器,也可以作爲郵件代理服務器,使用C語言開發。
Nginx 特點是佔有內存少,併發處理能力強,以高性能、低系統資源消耗而聞名,Nginx官方測試爲5萬併發請求。
日常中的併發量上限4萬左右。
1. 正向代理
正向代理類似一個跳板機,代理訪問外部資源。比如:我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器,它能訪問那個我不能訪問的網站,於是我先連上代理服務器,告訴它我需要那個無法訪問網站的內容,代理服務器去取回來,然後返回給我。代理客戶端去請求服務器,隱藏了真實客戶端,服務器並不知道真實的客戶端是誰。
2. 反向代理
反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器;
反向代理隱藏了真正的服務端,就像你每天使用百度的時候,只知道敲打www.baidu.com就可以打開百度搜索頁面,但背後成千上萬臺百度服務器具體是哪一臺爲我們服務的,我們並不知道。我們只知道這個代理服務器,它會把我們的請求轉發到真實爲我們服務的那臺服務器那裏去。
綜上所述:正向代理代理對象是客戶端,反向代理代理對象是服務端。軟件層面一般常用Nginx來做反向代理服務器,它的性能非常好,用來做負載均衡。
二、Nginx環境搭建
1. 下載
免費開源版的官方網站:http://nginx.org/en/download.html,可以下載穩定版(Stable version)
Nginx 有 Windows 版本和 Linux 版本,但更推薦在 Linux 下使用 Nginx;
下載nginx-1.14.2.tar.gz的源代碼文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz
或者在Windows上下載下來再上傳到Linux中
2. 安裝
(1)安裝相關庫
Nginx的安裝需要確定Linux安裝相關的幾個庫,否則配置和編譯會出現錯誤,相關庫有:
- gcc編譯器
- openssl庫
- pcre庫
- zlib庫
一次性檢查並安裝,若已安裝則跳過,若有更新,則進行更新:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
檢查庫是否安裝成功,下面的命令只能一個一個的檢查,或者再運行一遍上面的命令,若沒有操作則說明相關庫已經存在:
yum list installed | grep gcc
yum list installed | grep openssl
yum list installed | grep pcre
yum list installed | grep zlib
(2)安裝Nginx
- 解壓下載下來的nginx文件(.tar.gz),執行命令:
tar -zxvf nginx-1.14.2.tar.gz
- 切換至解壓後的nginx主目錄,在nginx主目錄nginx-1.14.2下執行命令:
./configure --prefix=/usr/local/nginx
(其中–prefix是指定nginx安裝路徑) 注意:等號左右不要有空格
3. 執行命令進行編譯:make
4. 執行命令進行安裝:make install
安裝成功後,可以切換到/usr/local/nginx目錄下,查看內容
(3)目錄簡介
- conf:存放配置文件,文件夾中每個配置文件都有兩份,以
.default
結尾的是默認配置 - html:存放頁面
- logs:存放日誌
- sbin:存放可執行文件
- *_temp:Nginx啓動後,安裝目錄下會出現一些_temp結尾的文件,這些是臨時文件,不用管。
3. 啓動
- 默認啓動:
- 切換到nginx安裝目錄的sbin目錄下,執行:
./nginx
- 切換到nginx安裝目錄的sbin目錄下,執行:
- 通過配置文件啓動:
- 通過
-c
指定配置文件的位置,而且配置文件路徑必須指定絕對路徑 - 可以在配置文件後加上
-t
參數,檢查配置文件是否存在語法錯誤
./nginx -c /usr/local/nginx/conf/nginx.conf # 相對路徑啓動 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 絕對路徑啓動 ./nginx -c /usr/local/nginx/conf/nginx.conf -t # 檢查配置文件是否存在語法錯誤
- 通過
4. 查看進程
查看進程:ps -ef | grep nginx
nginx 體系結構由 master 進程和其 worker 進程組成,啓動成功後至少有兩個進程,少於兩個則沒有成功
- master 進程爲主進程,讀取配置文件,並維護和管理 worker 進程,其父進程pid爲1
- worker 進程則對請求進行實際處理,worker可以有更多,>=1,父進程pid爲master的pid
Nginx的默認端口爲80,在瀏覽器中訪問 http://ip地址:80
即可訪問到Nginx,(默認端口爲80時,在地址欄中可以不指定端口)
5. 關閉
(1)優雅的關閉
- 找出nginx的進程號:
ps -ef | grep nginx
- 執行命令:
kill -QUIT 主pid
注意:
- 其中pid是主進程號的pid(master process),其他爲子進程pid(worker process)
- 這種關閉方式會處理完請求後再關閉,所以稱之爲優雅的關閉
(2)快速關閉
- 找出nginx的進程號:
ps -ef | grep nginx
kill -TERM 主pid
注意:
- 其中pid是主進程號的pid(master process),其他爲子進程pid(worker process)
- 這種關閉方式不管請求是否處理完成,直接關閉,比較暴力,稱之爲快速的關閉
(3)直接kill
- 找出nginx的進程號:
ps -ef | grep nginx
kill -9 主pid
6. 重啓
重啓使用的較多,當修改配置文件後,便需要重啓Nginx,重啓時不需要指定配置文件,使用的是最近一次啓動時用的配置文件
注意:如果用同一個Nginx使用多個不同的配置文件啓動了多個Nginx,則不能使用重啓,因爲Nginx會不知道重啓哪個配置文件
./nginx -s reload
7. 其它
Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
-v
:顯示 nginx 的版本-V
:顯示 nginx 的版本、編譯器版本和配置參數
8. Windows環境簡介
在官方網站下載最新windows版的nginx:http://nginx.org/en/download.html
將下載下來的nginx壓縮包解壓到一個目錄下,解壓後該軟件就可以啓動使用了
啓動方式1:雙擊解壓目錄下的nginx.exe
文件即可運行nginx;
啓動方式2:進入dos窗口,切換到nginx主目錄下,在dos窗口執行命令:start nginx
關閉方式1:在資源管理器殺掉Nginx進程(有兩個進程)
關閉方式2:在dos窗口切換到Nginx安裝主目錄下執行命令:nginx -s stop
三、配置文件
學習Nginx首先需要對它的核心配置文件有一定的認識,這個文件位於Nginx的安裝目錄/usr/local/nginx/conf
目錄下,名字爲nginx.conf
Nginx的核心配置文件主要由三個部分構成:基本配置,events配置,http配置
1. 基本配置
在文件中直接進行配置的是基本配置:
#配置worker進程運行用戶 nobody也是一個linux用戶,一般用於啓動程序,沒有密碼
#user nobody;
#配置工作進程數目,根據硬件調整,通常等於CPU數量或者2倍於CPU數量
worker_processes 1;
#配置全局錯誤日誌及類型,[debug | info | notice | warn | error | crit],默認是error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid; #配置進程pid文件
2. events配置
events主要用於配置工作模式和連接數,在 events{}
中進行配置
events {
# 配置每個worker進程連接數上限,nginx支持的總連接數就等於worker_processes * worker_connections
# 需要注意的是,worker_connections最大爲 65536
worker_connections 1024;
}
3. http配置
http {
#配置nginx支持哪些多媒體類型,可以在conf/mime.types查看支持哪些多媒體類型
include mime.types;
#默認文件類型 流類型,可以理解爲支持任意類型
default_type application/octet-stream;
#配置日誌格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#配置access.log日誌及存放路徑,並使用上面定義的main日誌格式,需要與上面的日誌格式同時打開
#access_log logs/access.log main;
sendfile on; #開啓高效文件傳輸模式
#tcp_nopush on; #防止網絡阻塞,上線時必須開
#keepalive_timeout 0;
keepalive_timeout 65; #長連接超時時間,單位是秒
#gzip on; #開啓gzip壓縮輸出,上線時必須開,開發時不開,防止沒有格式
###-----------------------------------------------
#配置虛擬主機
server {
listen 80; #配置監聽端口
server_name localhost; #配置服務名
#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虛擬主機的訪問日誌
#默認的匹配斜槓/的請求,當訪問路徑中有斜槓/,會被該location匹配到並進行處理
location / {
#root是配置服務器的默認網站根目錄位置,默認爲nginx安裝主目錄下的html目錄
root html;
#配置首頁文件的名稱
index index.html index.htm;
}
#error_page 404 /404.html; #配置404頁面
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; #配置50x錯誤頁面
#精確匹配
location = /50x.html {
root html;
}
#PHP 腳本請求全部轉發到Apache處理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#PHP 腳本請求全部轉發到FastCGI處理
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
#禁止訪問 .htaccess 文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
#配置另一個虛擬主機
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
#配置https服務,安全的網絡傳輸協議,加密傳輸,端口443,運維來配置
#
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
(1)基本配置
http配置主要是配置http服務器,利用它的反向代理功能提供負載均衡支持,在 http{}
中進行配置
注意:
- 上線必需要打開的配置:
gzip on(開發時不開)
,tcp_nopush on
(2)配置虛擬主機
虛擬主機配置在 http{server{}}
中,可以配置多個,其中比較重要的是location:
牢記 ip + port
等於root
的原則
- location後的
/
表示:ip + 端口號
,後面跟的參數相當於是網站名 - location中的
root
參數表示:- 若參數前不加
/
則表示 nginx的安裝路徑,例如:默認指定爲html,即表示爲nginx安裝主目錄下的html目錄 - 若參數前加
/
則表示 Linux 中的根路徑(/
)路徑
- 若參數前不加
/
與 root
後的路徑是一一對應的:舉個例子:比如說的我 Nginx 的ip爲192.168.0.1,端口爲 80,location 參數指定的值爲 /aa(相當於是war包的名字),root 配置參數指定的值爲 /opt/web(相當於把war包直接放到裏面),若訪問路徑爲 http://192.168.0.1:80/aa/index.html,則Nginx會訪問 /opt/web/aa/index.html 靜態文件
# 默認的匹配斜槓/的請求,當訪問路徑中有斜槓/,會被該location匹配到並進行處理
# 網站爲:http://www.ip:80/aa
location /aa {
# 磁盤路徑爲:/opt/web/aa
root /opt/web;
}
4. 修改配置文件的小技巧
適用於不太會用vim或者需要對文件進行大改的情況:
先將配置文件下載到Windows上,修改完畢後再上傳到Linux中,覆蓋原文件
-
sz :從Linux下載文件到本機 , 在Linux終端輸入命令回車後,選擇本地存儲路徑即可。
- 命令格式:
sz filename
下載文件filenamesz file1 file2
下載多個文件sz dir/*
下載dir目錄下所有文件
- 命令格式:
-
rz:從本地上傳文件到Linux,在Linux終端輸入命令回車後,選擇本地要上傳的文件即可,可一次指定多個文件
- 命令格式:
rz -y
選擇文件並上傳到執行命令所在的目錄
- 命令格式:
注意:
-
如果機器上沒有安裝過 lrzsz 安裝包,則無法使用 rz 和 sz 命令。
-
使用yum命令安裝:
yum install -y lrzsz
-
下載源碼進行安裝。下載地址:https://ohse.de/uwe/software/lrzsz.html
-
-
上傳和下載都默認使用Linux當前登錄的用戶,使用時要根據個人需要修改文件的權限。
四、負載均衡
1. 簡介
(1)硬件負載均衡
比如 F5、深信服、Array 等
- 優點:有廠商專業的技術服務團隊提供支持,性能穩定
- 缺點:費用昂貴,對於規模較小的網絡應用成本太高
(2)軟件負載均衡
比如 Nginx、LVS、HAProxy 等
- 優點:免費開源,成本低廉
- 缺點:性能沒有硬件高
所以,實際中,往往會兩者結合使用,在關鍵的位置使用硬件負載均衡,而其餘地方使用軟件負載均衡
2. 負載均衡配置
(1)在http模塊中加上upstream配置
- upstream:後面的地址隨便指定,但是不能有重複
- server:指定Tomcat服務器的地址
upstream www.myweb.com {
server 127.0.0.1:9100;
server 127.0.0.1:9200;
}
upstream是配置nginx與後端服務器負載均衡非常重要的一個模塊,並且它還能對後端的服務器的健康狀態進行檢查,若後端服務器中的一臺發生故障,則前端的請求不會轉發到該故障的機器
(2)在server模塊裏添加location,並配置proxy_pass
- proxy_pass:
http://
加上 upstream 後面的字符串(固定結構:proxy_pass http://
)
location /myweb {
proxy_pass http://www.myweb.com;
}
(3)location中添加配置
nginx反向代理配置時,後端的tomcat會出現request.getServerName()取不到代理地址(或域名)的問題,需要在location中添加下面的參數:
location /myweb {
proxy_pass http://www.myweb.com;
proxy_set_header Host $host;
}
參考:http://www.phpfensi.com/php/20131127/466.html
很詳細:https://blog.csdn.net/t8116189520/article/details/80668651
3. 常用負載均衡策略
實際中,若是服務器配置相同,則可以使用輪詢,若配置不同,簡單一點可以使用最小連接,也可以經過測試後,使用權重。至於Session丟失問題,這裏使用的是通過SpringSession來解決:https://editor.csdn.net/md?articleId=103880228。
(1)輪詢(默認)
這裏的輪詢並不是每個請求輪流分配到不同的後端服務器,與ip_hash類似,但是按照訪問url的hash結果來分配請求,使得每個url定向到同一個後端服務器,主要應用於後端服務器爲緩存時的場景下。如果後端服務器down掉,將自動剔除
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
(2)權重
每個請求按一定比例分發到不同的後端服務器,weight值越大訪問的比例越大,訪問比率約等於權重之比,權重越大訪問機會越多,用於後端服務器性能不均的情況
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
(3)ip_hash
ip_hash也叫IP綁定,每個請求按訪問ip的hash值分配,這樣每個訪問客戶端會固定訪問一個後端服務器,可以解決會話Session丟失的問題
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
(4)最少連接
web請求會被轉發到連接數最少的服務器上
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
4. 其它配置
-
backup:其它所有的非backup機器down的時候,才請求backup機器:
upstream backserver { server 127.0.0.1:9100; #其它所有的非backup機器down的時候,才請求backup機器 server 127.0.0.1:9200 backup; }
-
down:down表示當前的server是down狀態,不參與負載均衡:
upstream backserver { server 127.0.0.1:9100; #down表示當前的server是down狀態,不參與負載均衡 server 127.0.0.1:9200 down; }
五、靜態代理
把所有靜態資源的訪問改爲訪問nginx,而不是訪問tomcat,這種方式叫靜態代理。因爲nginx更擅長於靜態資源的處理,性能更好,效率更高。所以在實際應用中,我們將靜態資源比如圖片、css、html、js等交給nginx處理,而不是由tomcat處理。
1. 方式一:配置後綴
當訪問靜態資源,則從linux服務器/opt/static目錄下獲取(舉例)
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
說明:
~
:表示正則匹配,也就是說後面的內容可以是正則表達式匹配- 第一個點 ‘
.
’ 表示任意字符 *
:表示一個或多個字符\.
: 是轉義字符,是後面這個點的轉義字符|
: 表示或者$
:表示結尾
整個配置表示以 '.
'後面括號裏面的這些後綴結尾的文件都由nginx處理
注意:放置靜態資源的目錄,要注意一下目錄權限問題,如果權限不足,給目錄賦予權限; 否則會出現403錯誤
2. 方式二:配置目錄
當訪問靜態資源,則從linux服務器/opt/static目錄下獲取(舉例)
location ~ .*/(css|js|img|images) {
root /opt/static;
}
整個配置表示路徑中含有這些括號裏面的關鍵字的請求,都由nginx處理
注意:Nginx查找靜態資源位置也是根據ip + port
等於root
的原則查找圖片,假如網頁請求的圖片地址爲http://192.168.235.128/myweb/image/001.jpg
,不管是方式一還是方式二,請求都會交給nginx服務器進行處理。根據ip + port
等於root
的原則,Nginx會找位置爲/opt/static/myweb/image/001.jpg
的圖片
六、動靜分離
Nginx的負載均衡和靜態代理結合在一起,我們可以實現動靜分離,這是實際應用中常見的一種場景。
動態資源,如jsp由tomcat或其他web服務器完成
靜態資源,如圖片、css、js等由nginx服務器完成
它們各司其職,專注於做自己擅長的事情
動靜分離充分利用了它們各自的優勢,從而達到更高效合理的架構
實際中很常見的一種動靜分離的架構:
七、虛擬主機
一個域名只能綁定一臺機器,一個 ip,而虛擬主機,就是把一臺物理服務器劃分成多個“虛擬”的服務器,這樣我們的一臺物理服務器就可以當做多個服務器來使用,從而可以配置多個網站,綁定多個域名。
Nginx提供虛擬主機的功能,就是爲了讓我們不需要安裝多個Nginx,就可以運行多個域名不同的網站。
Nginx下,一個server{}
標籤就是一個虛擬主機。nginx的虛擬主機就是通過nginx.conf中server節點指定的,想要設置多個虛擬主機,配置多個server節點即可;
1. 基於端口的虛擬主機(瞭解)
基於端口的虛擬主機配置,使用端口來區分
瀏覽器使用 同一個域名+端口 或 同一個ip地址+端口訪問;
server {
listen 8080;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server {
listen 9090;
server_name www.myweb.com;
location /p2p {
proxy_pass http://www.p2p.com;
}
}
2. 基於域名的虛擬主機(掌握)
基於域名的虛擬主機是最常見的一種虛擬主機
server {
listen 80;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www. myweb.com;
}
}
server {
listen 80;
server_name www.p2p.com;
location /myweb {
proxy_pass http://www.p2p.com;
}
}
在windows中模擬DNS服務器解析域名:
需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置(前面是Linux的IP,後面是你自定義的域名):
192.168.208.128 www.myweb.com
192.168.208.128 www.p2p.com
3. include引入單獨的配置文件
可以將多個server{}標籤配置在一個 nginx.conf 文件的 http{} 標籤中,也可以單獨配置在一個文件中,然後通過include
的方式引入虛擬主機配置
include /usr/local/nginx/conf/vhost/vhost.conf;
將虛擬目錄的配置文件加入到”http {}”部分的末尾,與其他server並列;
文件是隔開的,配置更清晰,主文件沒有那麼多的server