Nginx版本:nginx-1.12.2.tar.gz
內(nèi)容介紹
一、 nginx 簡(jiǎn)介
1、什么是 nginx 和可以做什么事情
Nginx 是高性能的 HTTP 和反向代理的服務(wù)器,處理高并發(fā)能力是十分強(qiáng)大的, 能經(jīng)受高負(fù) 載的考驗(yàn),有報(bào)告表明能支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù),實(shí)際上能達(dá)到2~3萬(wàn)個(gè)并發(fā)連接數(shù)
2、正向代理
需要在客戶端配置代理服務(wù)器進(jìn)行指定網(wǎng)站訪問(wèn)(代理的是客戶端)
3、反向代理
暴露的是代理服務(wù)器地址,隱藏了真實(shí)服務(wù)器 IP 地址(代理的是服務(wù)器端)
4、負(fù)載均衡
增加服務(wù)器的數(shù)量,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原先請(qǐng)求集中到單個(gè)服務(wù)器上的 情況改為將請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,將負(fù)載分發(fā)到不同的服務(wù)器,也就是我們所說(shuō)的負(fù)載均衡
5、動(dòng)靜分離
二、 Nginx 的安裝
1、準(zhǔn)備工作
(1)打開(kāi)虛擬機(jī),使用遠(yuǎn)程連接工具連接 linux 操作系統(tǒng)
(2)到 nginx 官網(wǎng)下載軟件: http://nginx.org/
2、開(kāi)始進(jìn)行 nginx 安裝,在linux系統(tǒng)的服務(wù)器端安裝
(1)安裝 pcre 依賴第一種方式:
第一步 聯(lián)網(wǎng)下載 pcre 壓縮文件依賴到自己的電腦中
命令: wget
http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
第二步 連接遠(yuǎn)程服務(wù)器,把pcre 壓縮文件上傳到服務(wù)器中,然后解壓該壓縮文件
命令: tar –xvf pcre-8.37.tar.gz
第三步 進(jìn)入 pcre-8.37.tar.gz解壓后的目錄,執(zhí)行 ./configure , 執(zhí)行完成后,再執(zhí)行 make && make install 命令,完成pcre的安裝
第四步 查看pcre是否成功安裝的命令: pcre-config --version
(2)安裝 pcre 依賴第二種方式:
第一步 yum -y install pcre (yum命令直接自動(dòng)下載并且安裝pcre)
第二步 查看pcre是否成功安裝的命令: pcre-config --version
(3)安裝 openssl 、 zlib 、 gcc 依賴
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
(4)安裝 nginx
第一步 聯(lián)網(wǎng)下載 nginx 壓縮文件依賴到自己的電腦中
nginx 官網(wǎng)下載軟件: http://nginx.org/
第二步 連接遠(yuǎn)程服務(wù)器,把 nginx 壓縮文件上傳到服務(wù)器中,然后解壓該壓縮文件
執(zhí)行命令: tar –xvf nginx-1.12.2.tar.gz
第三步 進(jìn)入 nginx-1.12.2.tar.gz 解壓后的目錄,執(zhí)行 ./configure 來(lái)進(jìn)行檢查, 執(zhí)行完成后,再執(zhí)行 make && make install 命令,完成pcre的安裝
第四步 安裝完Nginx后,需要知道系統(tǒng)中多了哪些文件,它們都安裝到了那里。可以使用下面的命令進(jìn)行查看: rpm -ql nginx 其中rpm 是linux的rpm包管理工具,-q 代表詢問(wèn)模式,-l 代表返回列表,這樣我們就可以找到nginx的所有安裝位置了
第五步 安裝完Nginx后,會(huì)在usr下多出來(lái)一個(gè)文件夾local/nginx/nginx/sbin,在sbin里面有一個(gè) nginx 啟動(dòng)腳本,因此我們先執(zhí)行命令 cd/usr/local/nginx/sbin 找到nginx這個(gè)啟動(dòng)腳本,然后執(zhí)行命令 ./nginx 來(lái)啟動(dòng)nginx
第六步 執(zhí)行命令: ps -ef | grep nginx 查看進(jìn)程中是否有nginx,有就說(shuō)明nginx啟動(dòng)成功
第七步 用瀏覽器訪問(wèn)nginx,在瀏覽器中輸入:127.0.0.1 查看效果
第八步 如果沒(méi)有顯示上圖中的內(nèi)容,應(yīng)該是服務(wù)端沒(méi)有開(kāi)放80端口,把80端口開(kāi)放一下就可以了
- 查看開(kāi)放的端口號(hào)
- firewall-cmd --list-all
- 設(shè)置開(kāi)放的端口號(hào)
- firewall-cmd --add-service=http –permanent
- firewall-cmd --add-port=80/tcp --permanent
- 重啟防火墻
- firewall-cmd –reload
三、 Nginx 的常用命令和配置文件
Nginx 的常用命令
使用nginx操作命令,必須進(jìn)入 nginx 目錄中才可以
cd /usr/local/nginx/sbin
1、查看 nginx 版本號(hào)
./nginx -v
2、產(chǎn)看 nginx 的狀態(tài)
ps -ef | grep nginx
3、啟動(dòng) nginx
./nginx
4、停止 nginx
./nginx -s stop
4、從容停止 nginx
./nginx -s quit
4、比較野蠻的,直接殺死nginx進(jìn)程
./killall nginx
4、停止 nginx
./nginx -s stop
5、重新加載 nginx
./nginx -s reload
Nginx 的配置文件
Nginx 的配置文件的位置
1、查詢Nginx 的配置文件的位置,執(zhí)行命令: rpm -ql nginx
- 其中rpm 是linux的rpm包管理工具,-q 代表詢問(wèn)模式,-l 代表返回列表,這樣我們就可以找到nginx的所有安裝位置了
2、配置文件的位置:cd
/usr/local/nginx/conf/nginx.conf
配置文件中的內(nèi)容包含三部分內(nèi)容:全局塊 、 events 塊 、 http 塊(包含http塊自身和server塊)
nginx.conf文件的內(nèi)容如下:
# 第一部分:全局塊:配置服務(wù)器整體運(yùn)行的配置指令
#運(yùn)行用戶,默認(rèn)即是nginx,可以不進(jìn)行設(shè)置
user nginx;
#Nginx進(jìn)程,一般設(shè)置為和CPU核數(shù)一樣 -=> 處理并發(fā)數(shù)的配置
worker_processes 1;
#錯(cuò)誤日志存放目錄
error_log /var/log/nginx/error.log warn;
#進(jìn)程pid存放位置
pid /var/run/nginx.pid;
# 第二部分:events 塊:影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接
events {
worker_connections 1024; # 單個(gè)后臺(tái)進(jìn)程的最大并發(fā)數(shù)
}
# 第三部分:http 塊:還包含兩部分:http 全局塊和server 塊
http {
include /etc/nginx/mime.types; #文件擴(kuò)展名與類型映射表
default_type Application/octet-stream; #默認(rèn)文件類型
#設(shè)置日志模式
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 /var/log/nginx/access.log main; #nginx訪問(wèn)日志存放位置
sendfile on; #開(kāi)啟高效傳輸模式
#tcp_nopush on; #減少網(wǎng)絡(luò)報(bào)文段的數(shù)量
keepalive_timeout 65; #保持連接的時(shí)間,也叫超時(shí)時(shí)間
#gzip on; #開(kāi)啟gzip壓縮
include /etc/nginx/conf.d/*.conf; #包含的子配置項(xiàng)位置和文件[server快]
復(fù)制代碼
nginx.conf文件的內(nèi)容的最后一行,有一個(gè)子文件的配置項(xiàng)include /etc/nginx/conf.d/*.conf;,那我們打開(kāi)這個(gè)include子文件配置項(xiàng)看一下里邊都有些什么內(nèi)容,default.conf文件的內(nèi)容如下:
server {
listen 80; #配置監(jiān)聽(tīng)端口
server_name localhost; //配置域名
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; #服務(wù)默認(rèn)啟動(dòng)目錄
index index.html index.htm; #默認(rèn)訪問(wèn)文件
}
#error_page 404 /404.html; # 配置404頁(yè)面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #錯(cuò)誤狀態(tài)碼的顯示頁(yè)面,配置后需要重啟
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the php scripts to Apache listening on 127.0.0.1:80
#
# ~ .php$ 是正則表達(dá)式,匹配以.php結(jié)尾的所有文件
#location ~ .php$ {
# proxy_pass http://127.0.0.1; // 反向代理
#}
# 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;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /.ht {
# deny all; // deny是禁止訪問(wèn)
# allow all; // allow是允許訪問(wèn)
#}
}
復(fù)制代碼
四、 Nginx 配置實(shí)例 1 反向代理
反向代理指令:proxy_pass
server{
listen 80; // 瀏覽器端訪問(wèn)地址的端口號(hào)
# server_name 可以是網(wǎng)址域名; // 瀏覽器端訪問(wèn)的地址
# server_name 192.168.191.34; // 瀏覽器端訪問(wèn)的地址
# location / {
# proxy_pass http://123.com; // nginx 反向代理的地址,可以是域名
# proxy_pass 192.168.23.45.8080; // nginx 反向代理的地址
# };
# ~ /edu/ 是正則表達(dá)式,區(qū)分大小寫(xiě),匹配的是edu目錄
# ~* /edu/ 是正則表達(dá)式,不區(qū)分大小寫(xiě),匹配的是edu目錄
# = /edu/ 是正則表達(dá)式,嚴(yán)格匹配,匹配的是edu目錄
location ~ /edu/ {
proxy_pass 192.168.23.45.8081; // nginx 反向代理的地址
};
# ~ /vod/ 是正則表達(dá)式,匹配的是vod目錄
location ~ /vod/ {
proxy_pass 192.168.23.45.8082; // nginx 反向代理的地址
}
}
復(fù)制代碼
反向代理還有些常用的指令,我在這里給大家列出:
- proxy_set_header : 在將客戶端請(qǐng)求發(fā)送給后端服務(wù)器之前,更改來(lái)自客戶端的請(qǐng)求頭信息
- proxy_connect_timeout: 配置Nginx與后端代理服務(wù)器嘗試建立連接的超時(shí)時(shí)間
- proxy_read_timeout : 配置Nginx向后端服務(wù)器組發(fā)出read請(qǐng)求后,等待相應(yīng)的超時(shí)時(shí)間
- proxy_send_timeout:配置Nginx向后端服務(wù)器組發(fā)出write請(qǐng)求后,等待相應(yīng)的超時(shí)時(shí)間
- proxy_redirect : 用于修改后端服務(wù)器返回的響應(yīng)頭中的Location和Refresh
- 關(guān)于proxy代理指令的詳細(xì)信息: www.nginx.cn/doc/mail/ma…
五、 Nginx 配置實(shí)例 2 負(fù)載均衡
配置文件中的內(nèi)容包含三部分內(nèi)容:全局塊 、 events 塊 、 http 塊(包含http塊自身和server塊)
實(shí)現(xiàn)負(fù)載均衡主要在http塊和server塊里面配置
- http塊的配置如下:
http {
# ... 省略http塊默認(rèn)帶有的配置
upstream myserver {
server 115.28.52.63:8080 ;
server 115.28.52.63:8081 ;
}
}
復(fù)制代碼
- server塊的配置如下:
aerver {
location / {
... 省略location里面默認(rèn)帶有的配置
proxy_pass http://myserver; //myserver是上面創(chuàng)建的myserver服務(wù)名
proxy_connect_timeout 10;
}
}
復(fù)制代碼
- Nginx 提供了幾種常用的負(fù)載均衡(load balance)的分配方式(策略)
1、輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器 down 掉,能自動(dòng)剔除
2、 weight
weight 代表權(quán),重默認(rèn)為 1,權(quán)重越高被分配的客戶端越多
upstream server_pool {
server 192.168.5.21 weight=10; // weight 代表權(quán),重默認(rèn)為 1,權(quán)重越高被分配的客戶端越多
server 192.168.5.22 weight=10;
}
復(fù)制代碼
3、 ip_hash
每個(gè)請(qǐng)求按訪問(wèn) ip 的 hash 結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決 session 的問(wèn)題,例如:
upstream server_pool {
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
復(fù)制代碼
4、 fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配
upstream server_pool {
server 192.168.5.21:80;
server 192.168.5.22:80;
fair;
}
復(fù)制代碼
六、 Nginx 配置實(shí)例 3 動(dòng)靜分離
1、什么是動(dòng)靜分離?
Nginx 動(dòng)靜分離簡(jiǎn)單來(lái)說(shuō)就是把動(dòng)態(tài)跟靜態(tài)請(qǐng)求分開(kāi),不能理解成只是單純地把動(dòng)態(tài)頁(yè)面和 靜態(tài)頁(yè)面物理分離。嚴(yán)格意義上說(shuō)應(yīng)該是動(dòng)態(tài)請(qǐng)求跟靜態(tài)請(qǐng)求分開(kāi),可以理解成使用 Nginx 處理靜態(tài)頁(yè)面, Tomcat 處理動(dòng)態(tài)頁(yè)面
動(dòng)靜分離從目前實(shí)現(xiàn)角度來(lái)講大致分為兩種:
- 一種是純粹把靜態(tài)文件獨(dú)立成單獨(dú)的域名,放在獨(dú)立的服務(wù)器上,也是目前主流推崇的方案
- 另外一種方法就是動(dòng)態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過(guò) nginx 來(lái)分開(kāi)
2、動(dòng)靜分離具體配置
- 在 liunx 系統(tǒng)中準(zhǔn)備靜態(tài)資源,用于進(jìn)行訪問(wèn),在nginx里面,新建一個(gè)文件夾data
- 配置文件中的內(nèi)容包含三部分內(nèi)容:全局塊 、 events 塊 、 http 塊(包含http塊自身和server塊)
在 nginx 配置文件中server塊中進(jìn)行配置,server塊的配置如下:
aerver {
server 80;
server_name 192.168.17.129;
#chartset koi8-r;
#access_log log/host.access.log main;
# 通過(guò)nginx實(shí)現(xiàn)靜態(tài)資源跳轉(zhuǎn)
location /www/ {
# /data/是靜態(tài)資源目錄
root /data/;
index index.html index.htm;
}
# 通過(guò)nginx實(shí)現(xiàn)靜態(tài)資源跳轉(zhuǎn)
location /image/ {
# /data/是靜態(tài)資源目錄
root /data/;
# autoindex on是列出訪問(wèn)目錄,可以不加
autoindex on;
}
}
復(fù)制代碼
七、 Nginx 的高可用集群
1、什么是 nginx 高可用?
服務(wù)器的主nginx掛掉了,但是我們依然可以成功的請(qǐng)求到數(shù)據(jù)
(1)需要兩臺(tái)帶有 nginx 的服務(wù)器
(2)需要 keepalived 軟件;類似于路由,里面通過(guò)腳本來(lái)檢查當(dāng)前的 主服務(wù)器的nginx(主nginx) 是否還活著,如果活著就用,如果宕機(jī)死了,就去使用 從服務(wù)器的nginx(備份的nginx),在這個(gè)過(guò)程中,該軟件會(huì)向外提供一個(gè)虛擬IP,這個(gè)IP實(shí)際是不存在的,但是我們需要用這個(gè)虛擬IP去訪問(wèn)
(3)需要虛擬 ip
2、配置高可用的準(zhǔn)備工作
(1)需要兩臺(tái)服務(wù)器 192.168.17.129 和 192.168.17.131
(2)在兩臺(tái)服務(wù)器安裝 nginx 軟件
在上面有說(shuō)明如何安裝nginx
(3)在兩臺(tái)服務(wù)器安裝 keepalived 軟件
1) 為了方便,可以直接使用 yum 命令進(jìn)行安裝
yum install keepalived –y
安裝的版本是 keepalived.x86_64 0:1.3.5-8.el7_6.5
2)查看是否安裝成功:rpm -q -a keepalived
3)安裝之后,在 etc 目錄里面生成目錄 keepalived,目錄 keepalived里面有文件 keepalived.conf
3、完成高可用配置(主從配置,2個(gè)服務(wù)器都要配置)
(1)主要是修改
/etc/keepalived/keepalivec.conf 配置文件
# 全局定義
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # 服務(wù)器的主機(jī)的名字,可以訪問(wèn)到主機(jī)
# /etc/hosts 文件中,添加主機(jī)名字 例如:127.0.0.1 LVS_DEVEL
}
# 檢測(cè)腳本(查看nginx是否還活著)和權(quán)重參數(shù)
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 這個(gè)是自己創(chuàng)建的腳本文件位置
interval 2 # 檢測(cè)腳本執(zhí)行的間隔,2秒執(zhí)行一次
weight 2 # 權(quán)重
}
# 虛擬IP的配置,常用的配置
vrrp_instance VI_1 {
state BACKUP # 備份服務(wù)器上將 MASTER 改為 BACKUP
interface ens33 //服務(wù)器網(wǎng)卡名稱 使用ifconfig命令來(lái)查看
virtual_router_id 51 # 主、備機(jī)的 virtual_router_id 必須相同
priority 90 # 主、備機(jī)取不同的優(yōu)先級(jí),主機(jī)值較大,備份機(jī)值較小
advert_int 1 # 心跳檢測(cè),確認(rèn)主服務(wù)器是否還活著,檢測(cè)間隔為1秒
authentication {
auth_type PASS # 權(quán)限校驗(yàn)的方式:密碼
auth_pass 1111 # 權(quán)限校驗(yàn)的密碼:1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虛擬地址
}
}
復(fù)制代碼
(2)在/usr/local/src 添加檢測(cè)腳本文件nginx_check.sh
/usr/local/nginx/sbin/nginx 是nginx的啟動(dòng)路徑
3)把兩臺(tái)服務(wù)器上 nginx 和 keepalived 啟動(dòng)
啟動(dòng) nginx: ./nginx
啟動(dòng) keepalived: systemctl start keepalived.service
4、最終測(cè)試
1)在瀏覽器地址欄輸入 虛擬 ip 地址 192.168.17.50
2)把主服務(wù)器(192.168.17.129) nginx 和 keepalived 停止,再輸入 192.168.17.50查看效果
八、Nginx 的原理的簡(jiǎn)單分析
1、 Nginx 的原理
是通過(guò) mater 和 worker 來(lái)實(shí)現(xiàn)的
2、 worker 如何進(jìn)行工作的?
默認(rèn)只有一個(gè)master,多個(gè)worker,有請(qǐng)求過(guò)來(lái)后,首先master會(huì)收到,然后由mster告知worker有新的請(qǐng)求過(guò)來(lái)了,這時(shí)候woker通過(guò)爭(zhēng)搶機(jī)制,來(lái)得到這個(gè)新的請(qǐng)求,從來(lái)進(jìn)行相應(yīng)的處理
3、一個(gè) master 和多個(gè) woker 有好處
(1)可以使用 nginx –s reload 熱部署,利用 nginx 進(jìn)行熱部署操作
(2)每個(gè) woker 是獨(dú)立的進(jìn)程,如果有其中的一個(gè) woker 出現(xiàn)問(wèn)題,其他 woker 獨(dú)立的, 繼續(xù)進(jìn)行爭(zhēng)搶,實(shí)現(xiàn)請(qǐng)求過(guò)程,不會(huì)造成服務(wù)中斷
4、設(shè)置多少個(gè) woker 合適
worker 數(shù)和服務(wù)器的 cpu 數(shù)相等是最為適宜的
5、連接數(shù) worker_connection
(1)第一個(gè):發(fā)送請(qǐng)求,占用了 woker 的幾個(gè)連接數(shù)?
答案: 2 或者 4 個(gè)
解析:nginx配置的動(dòng)靜分離,請(qǐng)求靜態(tài)資源占用2個(gè)連接數(shù),請(qǐng)求動(dòng)態(tài)資源,因?yàn)橐ㄟ^(guò)tomcat找數(shù)據(jù)庫(kù)的數(shù)據(jù),所以占用4個(gè)連接數(shù)
(2)第二個(gè): nginx 有一個(gè) master,有四個(gè) woker,每個(gè) woker 支持最大的連接數(shù) 1024,支持的 最大并發(fā)數(shù)是多少?
普通的靜態(tài)訪問(wèn)最大并發(fā)數(shù)是: worker_connections * worker_processes /2
普通的靜態(tài)訪問(wèn)最大并發(fā)數(shù)是: 每個(gè)woker 支持最大的連接數(shù) * woker個(gè)數(shù) /2
而如果是 HTTP 作 為反向代理來(lái)說(shuō),最大并發(fā)數(shù)量是 worker_connections * worker_processes/4
而如果是 HTTP 作 為反向代理來(lái)說(shuō),最大并發(fā)數(shù)量是: 每個(gè)woker 支持最大的連接數(shù) * woker個(gè)數(shù) /4
原文鏈接:
https://juejin.cn/post/6933106590446944264






