-
Nginx
("engine x")是一個高性能的HTTP
和反向代理web服務(wù)器
,特點是占有內(nèi)存少辉哥,并發(fā)能力強恼布。 -
正向代理
:在客戶端(瀏覽器)配置代理服務(wù)器,通過代理服務(wù)器進行互聯(lián)網(wǎng)訪問秕岛。 -
反向代理
:將請求發(fā)送到反向代理服務(wù)器碌燕,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后再返回給客戶端误证,暴露的是代理服務(wù)器地址,隱藏了真實服務(wù)器的IP地址修壕。 -
負載均衡
:將原先請求集中到單個服務(wù)器上的流量改為分發(fā)到多個服務(wù)器上愈捅。 -
動靜分離
:把動態(tài)頁面和靜態(tài)頁面分別由不同的服務(wù)器來解析,以加快網(wǎng)站的解析速度慈鸠,降低原來單個服務(wù)器的壓力蓝谨。 - 查看
Nginx
版本號:./nginx -v
- 查看
Nginx
安裝路徑:whereis nginx
:/usr/local/nginx
- 啟動
Nginx
:./nginx
- 停止
Nginx
:./nginx -s stop
- 重新加載
Nginx
:./nginx -s reload
- 查看
Nginx
進程狀態(tài):ps -ef | grep nginx
- docker 拉取 Nginx 鏡像并運行一個容器實例:
docker search nginx
docker pull nginx
docker images nginx
docker run -d --name mynginx -p 80:80 nginx
docker ps
docker exec -it mynginx /bin/bash
- 配置文件:
nginx.conf
:/usr/local/nginx/conf/nginx.conf
,其內(nèi)容包含3部分:
①
全局塊
:從首行到events塊
之間的內(nèi)容青团,主要設(shè)置一些影響 nginx 服務(wù)器整體運行的配置指令譬巫,包括配置運行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù)壶冒,進程 PID 存放路徑缕题、日志存放路徑和類型以及配置文件的引入等。
②events塊
:主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接胖腾。常用的設(shè)置包括是否開啟對多 work process下的網(wǎng)絡(luò)連接進行序列化烟零,是否允許同時接收多個網(wǎng)絡(luò)連接,選取哪種事件驅(qū)動模型來處理連接請求咸作,每個 word process 可以同時支持的最大連接數(shù)等锨阿。
③http塊
:包括http全局塊
和server塊
。每個http 塊
可以包括多個server 塊
记罚,而每個server 塊
就相當(dāng)于一個虛擬主機
墅诡。
(3.1)、http全局塊
配置的指令包括文件引入桐智、MIME-TYPE 定義末早、日志自定義、連接超時時間说庭、單鏈接請求數(shù)上限等然磷。
(3.2)、server塊
:這塊和虛擬主機有密切關(guān)系刊驴,從用戶的角度看姿搜,虛擬主機相當(dāng)于一臺獨立的硬件主機,該技術(shù)的產(chǎn)生是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本捆憎。每個server塊
分為全局server塊
和多個location塊
舅柜。
(3.2.1)、全局server塊
:最常見的配置是本虛擬機主機的監(jiān)聽配置和本虛擬主機的名稱或 IP 配置躲惰。
(3.2.2)致份、location塊
:一個server塊
可以配置多個location塊
〈〔Γ基于 Nginx 服務(wù)器接收到的請求字符串(例如 server_name/uri-string)知举,對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配瞬沦,對特定的請求進行處理。地址定向雇锡、數(shù)據(jù)緩存和應(yīng)答控制等功能逛钻,還有許多第三方模塊的配置也在這里進行。
- 修改Nginx 配置文件:nginx.conf
# ================ 1锰提、全局塊開始 ==================
#user nobody;
# worker_processes 值越大曙痘,可以支持的并發(fā)處理量也就越多,但會受到硬件立肘、軟件等設(shè)備的制約
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# ================ 1边坤、全局塊結(jié)束 ==================
# ================ 2、events 塊開始 ===============
events {
# 每個 work process 支持的最大連接數(shù)為 1024
worker_connections 1024;
}
# ================ 2谅年、events 塊結(jié)束 ===============
# ================ 3茧痒、http 塊開始 =================
http {
# ================ 3.1、http 全局塊開始 =================
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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# ================ 3.1融蹂、http 全局塊結(jié)束 =================
# ================ 3.2旺订、server 塊開始 ===================
# 負載均衡服務(wù)列表配置,服務(wù)名為 myserver超燃,weight 為權(quán)重
upstream myserver {
server 192.168.211.143:8080;
server 192.168.211.143:8081;
}
server {
# ================ 3.2.1区拳、server 全局塊開始 ===================
listen 80;
server_name 192.168.211.143;
#charset koi8-r;
#access_log logs/host.access.log main;
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
# ================ 3.2.2、server 全局塊結(jié)束 ===================
# ================ 3.2.3意乓、location 塊開始 =====================
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#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;
#}
# ================ 3.2.3樱调、location 塊結(jié)束 =====================
}
# another virtual host using mix of IP-, name-, and port-based configuration
# 配置虛擬主機訪問映射規(guī)則
server {
listen 9001;
server_name 192.168.211.143;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
# 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;
# }
#}
# ================ 3.2、server 塊結(jié)束 ===================
}
# ================ 3届良、http 塊結(jié)束 =================
-
location
指令說明:用于匹配URL
笆凌。
location [ = | ~ | ~* | ^~] uri {
}
1、
=
:用于不含正則表達式的URI前士葫,要求請求字符串與URI嚴格匹配乞而,若匹配成功,則停止繼續(xù)向下搜索并立即處理該請求为障。
2晦闰、~
:用于表示URI包含正則表達式放祟,且區(qū)分大小寫
鳍怨。
3、~*
:用于表示URI包含正則表達式跪妥,且不區(qū)分大小寫
鞋喇。
4、^~
:用于不含正則表達式的URI前眉撵,要求Nginx服務(wù)器找到標(biāo)識URI和請求字符串匹配度最高的location后侦香,立即使用此location處理請求落塑,而不再使用location塊中的正則uri和請求字符串做匹配。
- 注意: 若uri包含正則表達式罐韩,則必須要有
~
或者~*
標(biāo)識憾赁。 -
Nginx
分配服務(wù)器策略:
1、
輪詢
(默認):每個請求按時間順序逐一分配到不同的后端服務(wù)器散吵,若后端服務(wù)器宕機龙考,則會自動剔除。
2矾睦、權(quán)重
(weight
):代表權(quán)重默認為1晦款,權(quán)重越高被分配的客戶端越多。
# 負載均衡服務(wù)列表配置枚冗,服務(wù)名為 myserver缓溅,weight 為權(quán)重
upstream myserver {
server 192.168.211.143:8080 weight=5;
server 192.168.211.143:8081 weight=10;
}
3、
ip_hash
:每個請求按訪問 ip 的 hash 結(jié)果分配赁温,這樣每個訪客固定訪問一個后端服務(wù)器坛怪,可以解決session問題。
upstream myserver {
ip_hash;
server 192.168.211.143:8080;
server 192.168.211.143:8081;
}
-
動靜分離
:把動態(tài)跟靜態(tài)請求分開束世,可以理解成使用 Nginx處理靜態(tài)頁面酝陈,Tomcat 處理動態(tài)頁面。動靜分離從目前實現(xiàn)角度來講大致分為兩種:一種是純粹把靜態(tài)文件放在獨立的服務(wù)器上毁涉,也是目前主流推崇的方案沉帮;另外一種就是動態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過 nginx 來分開贫堰。具體實現(xiàn):通過location
指定不同的后綴名
實現(xiàn)不同的請求轉(zhuǎn)發(fā):
通過
expires
參數(shù)設(shè)置穆壕,可以使瀏覽器緩存過期時間,減少與服務(wù)器之前的請求和流量其屏。具體expires
定義:給一個資源設(shè)定一個過期時間喇勋,無需去服務(wù)端驗證,直接通過瀏覽器自身確認是否過期即可偎行,所以不會產(chǎn)生額外的流量川背。此種方法非常適合不經(jīng)常變動的資源
。若是經(jīng)常更新的文件蛤袒,則不建議使用expires
來緩存熄云。假設(shè)設(shè)置某個url的expires
值為3d,表示在這 3 天之內(nèi)訪問這個 URL妙真,發(fā)送一個請求缴允,比對服務(wù)器該文件最后更新時間沒有變化,就不會從服務(wù)器抓取珍德,返回狀態(tài)碼304
练般;若有修改矗漾,則直接從服務(wù)器重新下載,返回狀態(tài)碼200
薄料。(304狀態(tài)碼
:當(dāng)你發(fā)出一個GET請求時服務(wù)器會從緩存中調(diào)用你要訪問的內(nèi)容敞贡,這個時候服務(wù)器就可以判斷這個頁面是不是更新過了,如果未更新過那么它會給你返回一個304狀態(tài)碼摄职。)
# 訪問 url:ip/www/index.html
location /www/ {
root /data/;
index index.html index.htm;
}
# 訪問 url:ip/image/01.jpg
location /image/ {
root /data/;
# 列出當(dāng)前文件夾下的所有文件及文件夾
autoindex on;
}
-
Nginx高可用
:兩臺業(yè)務(wù)系統(tǒng)啟動著相同的服務(wù)嫡锌,若有一臺出現(xiàn)故障,則另一臺自動接管琳钉。通過keekpalived
軟件來實現(xiàn)势木。作用是檢測服務(wù)器的狀態(tài)
,如果有一臺web服務(wù)器宕機歌懒,或工作出現(xiàn)故障啦桌,Keepalived將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除及皂,同時使用其他服務(wù)器代替該服務(wù)器的工作甫男。當(dāng)服務(wù)器工作正常后Keepalived自動將服務(wù)器加入到服務(wù)器群中,這些工作全部自動完成验烧,不需要人工干涉板驳,需要人工做的只是修復(fù)故障的服務(wù)器。
- 安裝命令:
yum install keepalived
碍拆。查看是否安裝成功:rpm -q -a keepalived
若治。 -
keepalived
軟件主要是通過VRRP協(xié)議
實現(xiàn)高可用的功能。VRRP
是Virtual Router RedundancyProtocol
(虛擬路由器冗余協(xié)議)的縮寫感混,其目的為了解決靜態(tài)路由出現(xiàn)的單點故障
問題端幼,能夠保證當(dāng)個別節(jié)點宕機時,整個網(wǎng)絡(luò)可以不間斷地運行弧满。
- 修改
keepalived
的配置文件:keepalived.conf
# 全局定義
global_defs {
# 設(shè)置報警郵件地址婆跑,可以設(shè)置多個,每行一個庭呜,需要開啟 sendmail服務(wù)
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 設(shè)置郵件的發(fā)送地址
notification_email_from Alexandre.Cassen@firewall.loc
# 設(shè)置 SMTP Server 地址
smtp_ server 192.168.17.129
# 設(shè)置 SMTP Server 超時時間
smtp_connect_timeout 30
# 表示運行 keeplived 服務(wù)器的一個標(biāo)識滑进,發(fā)郵件時顯示大郵件主題中的信息
# LVS_DEVEL這字段在/etc/hosts文件中設(shè)置募谎;通過它訪問到主機:127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # 檢測腳本執(zhí)行的間隔:2s
weight 2 # 權(quán)重:若這個腳本檢測為真,則服務(wù)器權(quán)重+2
}
vrrp_instance VI_1 {
state BACKUP # 備份服務(wù)器上將 MASTER 改為 BACKUP
interface ens32 # 網(wǎng)卡名稱近哟,通過 ifconfig 命令查看
virtual_router_id 51 # 主鲫寄、備機的 virtual_router_id 必須相同
priority 100 # 主吉执、備機取不同的優(yōu)先級,主機值較大戳玫,備份機值較小
advert_int 1 # 每隔1s發(fā)送一次心跳
authentication { # 校驗方式:類型是密碼,密碼1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛擬ip
192.168.211.50 # VRRP H虛擬ip地址
}
}
- 在路徑
/usr/local/src/
下新建檢測腳本nginx_check.sh
:
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];
then /usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];
then killall keepalived
fi
fi
- 給腳本
nginx_check.sh
加個執(zhí)行權(quán)限:chmod u+x nginx_check.sh
- 啟動keepalived:
systemctl start keepalived.service
- 停止keepalived:
systemctl stop keepalived.service
- 查看keepalived進程狀態(tài):
ps -ef | grep keepalived
- 1個 master 和多個 woker 的好處:①可以使用
nginx –s reload
進行熱部署操作;②每個 woker 都是獨立的進程府阀,若其中1個 woker 出現(xiàn)問題缆镣,則其他 woker 不受影響,繼續(xù)進行爭搶试浙,實現(xiàn)請求過程董瞻,不會造成服務(wù)中斷。 - 設(shè)置多少個 woker 合適:Nginx同redis類似都采用了
IO多路復(fù)用機制
田巴,每個worker都是1個獨立的進程钠糊, 但每個進程里只有1個主線程,通過異步非阻塞
的方式來處理請求壹哺。即使是千上萬個請求也不在話下抄伍。每個worker的線程可以把1個cpu的性能發(fā)揮到極致。因此管宵,worker數(shù)和服務(wù)器的cpu數(shù)相等是最為適宜的選擇截珍。設(shè)置少了會浪費cpu,多了會造成cpu頻繁切換上下文帶來的損耗箩朴。
# 設(shè)置worker數(shù)量
worker.processes 4
# work綁定cpu(4work綁定4cpu)
worker_cpu_affinity 0001 0010 0100 1000
# work綁定cpu (4work綁定8cpu中的4個)
worker_cpu_affinity 0000001 00000010 00000100 00001000
- 連接數(shù)
worker_connection
:①發(fā)送請求笛臣,占用了woker 2個或4個連接數(shù)。②nginx 有一個 master隧饼,有四個 woker沈堡,每個 woker 支持最大的連接數(shù) 1024,支持的最大并發(fā)數(shù)是多少燕雁?
a诞丽、普通的靜態(tài)訪問最大并發(fā)數(shù)是: worker_connections * worker_processes /2;
b拐格、若是HTTP 作為反向代理僧免,則最大并發(fā)數(shù)量為worker_connections * worker_processes/4。