1.Nginx簡(jiǎn)介
nginx 可以作為靜態(tài)頁面的web服務(wù)器凄敢,同時(shí)還支持CGI協(xié)議的動(dòng)態(tài)語言碌冶,比如Perl,php單不支持java Java程序戲能通過tomcat配合完成涝缝,nginx專門為性能優(yōu)化而開發(fā)扑庞,性能是最重要的考量,實(shí)現(xiàn)上非常注重效率拒逮,能經(jīng)受高負(fù)載的考驗(yàn)
有報(bào)告顯示能支持50000個(gè)并發(fā)連接數(shù)
1.1nginx 安裝
安裝之前的依賴? pcre-8.37.tar.gz
openssl-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.11.1.tar.gz
使用yum命令安裝依賴
命令:yum -y install? gcc zlib zlib-devel pcre-devel openssl openssl-devel
安裝nginx
下載nginx 網(wǎng)址http://nginx.org/en/download.html
1.使用命令tar -xvf nginx-1.12.2.tar.gz
2.進(jìn)入nginx-1.12.2文件夾 cd nginx-1.12.2/
3.執(zhí)行命令 ./configure
4.執(zhí)行命令 make? && make install
安裝成功后罐氨,再usr/local/nginx? 目錄中有sbin腳本
啟動(dòng)nginx 提示:nginx: [emerg] unknown directive "stub_status" in /usr/local/nginx/conf/nginx.conf:80
Nginx沒有添加modules/ngx_http_stub_status_module.o模塊。
問題解決 沒有安裝的話消恍,可以在tar包安裝編譯的時(shí)候添加如下參數(shù):重新執(zhí)行第三步
? ./configure --prefix=/usr/local/nginx?--with-http_stub_status_module
1.2 查詢 進(jìn)程nginx :
ps -ef | grep nginx
1.3 開啟防火墻
查詢防火墻命令: firewall -cmd --list -all
# 查看防火墻狀態(tài)? service iptables status??
# 停止防火墻? service iptables stop??
# 啟動(dòng)防火墻? service iptables start??
# 重啟防火墻?? service iptables restart??
# 永久關(guān)閉防火墻? chkconfig iptables off??
# 永久關(guān)閉后重啟? chkconfig iptables?on
開啟80端口?? vim /etc/sysconfig/iptables
# 加入如下代碼 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
保存退出后重啟防火墻?? service iptables restart
1.4 nginx 常用命令
1使用nginx 操作 需要進(jìn)入nginx的目錄中cd? /usr/local/nginx/sbin
查詢版本號(hào)./nginx -v
關(guān)閉nginx ./nginx -s stop
啟動(dòng)nginx ./nginx
重新加載nginx ./nginx -s reload
1.5 nginx 配置文件
? ?? 文件位置:/usr/local/nginx/conf/nginx.conf
nginx的配置文件分三部分
1 全局塊
從配置文件開始到events塊之間的內(nèi)容 岂昭,主要會(huì)影響nginx服務(wù)器的整體運(yùn)行配置指令,主要包括配置運(yùn)行服務(wù)器的用戶狠怨,允許生產(chǎn)的worker process 數(shù)约啊,進(jìn)程pid存放路徑,日志存放路徑佣赖,配置文件的引入
worker_processess 1? 值越大恰矩,支持并發(fā)處理的量越多
2? ? events塊
影響服務(wù)器與用戶之間的網(wǎng)絡(luò)連接
worker_connections 1024? ? 用戶的最大的連接數(shù)
3? ?? http 全局塊
http塊 包括 http全局塊 和server塊
2.反向代理
正向代理:如果吧局域網(wǎng)外的Internet 想象成一個(gè)資源庫,則局域網(wǎng)的客戶端要訪問Internet 需要通過代理服務(wù)器來訪問憎蛤,這種代理服務(wù)器外傅,稱為正向代理
反向代理:反向代理服務(wù)器位于用戶與目標(biāo)服務(wù)器之間,但是對(duì)于用戶而言俩檬,反向代理服務(wù)器就相當(dāng)于目標(biāo)服務(wù)器萎胰,即用戶直接訪問反向代理服務(wù)器就可以獲得目標(biāo)服務(wù)器的資源。同時(shí)棚辽,用戶不需要知道目標(biāo)服務(wù)器的地址技竟,也無須在用戶端作任何設(shè)定。反向代理服務(wù)器通城辏可用來作為Web加速榔组,即使用反向代理作為Web服務(wù)器的前置機(jī)來降低網(wǎng)絡(luò)和服務(wù)器的負(fù)載熙尉,提高訪問效率。
事例1
1,效果:
打開瀏覽器搓扯,在瀏覽器地址欄中輸入www.123.com跳轉(zhuǎn)到Linux系統(tǒng)tomcat主頁中
2準(zhǔn)備工作
1在Linux中安裝tomcat 默認(rèn)端口8080
tomcat安裝文件放再liunx系統(tǒng)中解壓 進(jìn)入tomcat的bin目錄中?? ./startup.sh? 啟動(dòng)tomcat服務(wù)器
對(duì)外開放訪問端口? ? firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd -reload
? 3配置
配置hosts文件 192.168.137.128www.123.com
location ~
? ? ? ? {
? ? ? proxy_pass http://192.168.199.144;?? //反向代理配置 跳轉(zhuǎn)ip地址
? ? ? ? }
事例2
1效果
使用nginx反向代理根據(jù)訪問的路徑跳轉(zhuǎn)到不同端口的服務(wù)中检痰,nginx監(jiān)聽端口9001
訪問http://192.168.137.128:9001/edu/ 直接跳轉(zhuǎn)到192.168.199.144
訪問http://192.168.137.128:9001/vod/ 直接跳轉(zhuǎn)到192.168.199.143:8080
2準(zhǔn)備2臺(tái)服務(wù)器 ip地址 分別為143,144
3配置nginx
找到nginx的配置文件 : \usr\local\nginx\conf\nginx.conf
server{
listen 9001;
server_name 192.168.137.128
location ~? /edu/{? ? ? // 使用正則表達(dá)式匹配有edu的路徑 轉(zhuǎn)發(fā)到192.168.199.144 服務(wù)器
proxy_pass http://192.168.199.144
}
location ~ /vod/{
proxy_pass http://192.168.199.143:8080
}
}
4重新加載nginx服務(wù)器
location 指令說明
該指令用于匹配url
語法:
location [ = | ~ | ~* |^~] uri{
}
= :用戶不含正則表達(dá)式的URI前,要求請(qǐng)求字符串和URI嚴(yán)格匹配锨推,如果匹配成功就停止向下搜索并立即處理該請(qǐng)求
~:用戶表示URI包含正則表達(dá)式 區(qū)分大小寫
~* 用戶表示URI包含正則表達(dá)式 不區(qū)分大小寫
^~:用戶不含正則表達(dá)式URI前要求nginx服務(wù)器找到表示URI和請(qǐng)求字符串匹配度最高的location后立即使用該location處理請(qǐng)求
3.負(fù)載均衡
負(fù)載均衡铅歼,英文名稱為L(zhǎng)oad Balance,其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡爱态、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行谭贪,例如FTP服務(wù)器、Web服務(wù)器锦担、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等俭识,從而協(xié)同完成工作任務(wù)。
負(fù)載均衡構(gòu)建在原有網(wǎng)絡(luò)結(jié)構(gòu)之上洞渔,它提供了一種透明且廉價(jià)有效的方法擴(kuò)展服務(wù)器和網(wǎng)絡(luò)設(shè)備的帶寬套媚、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、增加吞吐量磁椒、提高網(wǎng)絡(luò)的可用性和靈活性堤瘤。
3.1 事例1
效果
通過瀏覽器地址欄輸入地址http://192.168.137.128/edu/a.html,通過負(fù)載均衡 評(píng)價(jià)分配到 多個(gè)服務(wù)器中
在nginx配置文件中配置負(fù)載均衡
在http塊中添加
upstream myserver{? ? ? //添加負(fù)載均衡的名稱
server?? 192.168.199.144:8080; #服務(wù)器列表
server? 192.168.199.144:8081;
server192.168.199.143:8080;
}
在server塊中配置信息
listen? 80 ;? #? 監(jiān)聽端口號(hào)
server_name 192.168.137.26; #監(jiān)聽的ip地址
location / {
proxy_pass? http://myserver; # 負(fù)載均衡的名稱
}
負(fù)載均衡的策略
1 輪詢:每個(gè)請(qǐng)求的按照時(shí)間順序逐一分配到不同的后端服務(wù)器浆熔,如果服務(wù)器宕機(jī)本辐,能自動(dòng)剔除
2 weight? 代表權(quán)重默認(rèn)為1 權(quán)重越高被分配的越多
upstream myserver{//添加負(fù)載均衡的名稱
server?? 192.168.199.144:8080weight =5;
server? 192.168.199.144:8081 weight=10;
server192.168.199.143:8080;
}
3 ip_hash
每個(gè)請(qǐng)求按照ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器医增,可以解決session的問題
upstream myserver{//添加負(fù)載均衡的名稱
ip_hash;
server?? 192.168.199.144:8080; #服務(wù)器列表
server? 192.168.199.144:8081;
server192.168.199.143:8080;
}
4 fair 第三方 按照后端服務(wù)器的相應(yīng)時(shí)間來分配請(qǐng)求慎皱,響應(yīng)時(shí)間短的優(yōu)先分配
upstream myserver{//添加負(fù)載均衡的名稱
server?? 192.168.199.144:8080; #服務(wù)器列表
server? 192.168.199.144:8081;
server192.168.199.143:8080;
fair;
}
4.動(dòng)靜分離
動(dòng)靜分離是指在web服務(wù)器架構(gòu)中,將靜態(tài)頁面與動(dòng)態(tài)頁面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開不同系統(tǒng)訪問的架構(gòu)設(shè)計(jì)方法叶骨,進(jìn)而提升整個(gè)服務(wù)訪問性能和可維護(hù)性茫多。
通過location指定不同的后綴名實(shí)現(xiàn)不同的請(qǐng)求轉(zhuǎn)發(fā),通過expires參數(shù)設(shè)置忽刽,可以使瀏覽器的緩存過期時(shí)間天揖,減少與服務(wù)器之間的請(qǐng)求和流量,具體expire是定義時(shí)給一個(gè)資源設(shè)定一個(gè)過期時(shí)間跪帝,就說無需去服務(wù)器驗(yàn)證直接通過瀏覽器自身確認(rèn)是否過期即可今膊,所有不會(huì)產(chǎn)生額外的瀏覽,這種方法伞剑,適合不經(jīng)常變動(dòng)的資源斑唬,如果經(jīng)常更新的文件不見識(shí)使用expire是來緩存,
在nginx的配置文件中配置動(dòng)靜分離
server{
listen?? 80; #監(jiān)聽端口
server_name 192.168.199.144;#監(jiān)聽的服務(wù)器ip地址
location /www/ {? # /www/ 規(guī)則
root? /data/;?? #靜態(tài)資源的路徑
index index.html index.htm index.php
}
location? /image/ { #/image/ 規(guī)則? 路徑中有image的參數(shù)
root /data/; #靜態(tài)資源的路徑
autoindex on; #列出文件夾的內(nèi)容
}
}
5 Nginx配置高可用的集群
1 做一個(gè) 主服務(wù)器和一個(gè)備服務(wù)器的nginx
2 使用keepalived 軟件來檢測(cè)nginx服務(wù)器是否宕機(jī) 如果檢測(cè)主服務(wù)器宕機(jī) 則自動(dòng)切換到備份服務(wù)器
學(xué)習(xí)是是要使用以下工具
1 需要兩臺(tái)服務(wù)器
2 兩臺(tái)服務(wù)器安裝nginx
3 兩臺(tái)服務(wù)器安裝keepalived
安裝nginx 步驟從第一部分查看
安裝keepalived 使用yum命令安裝? yum install keepalived -y
安裝文件完成后會(huì)生成一個(gè)配置文件? 位置 /etc/keepalived/keepalived.conf
4修改配置文件來完成主備
global_defs{
router_id LVS_DEVEL? ? #訪問到主機(jī)服務(wù)器
}
LVS_DEVEL的來源 /etc/hosts
#檢測(cè)腳本和權(quán)重的參數(shù)
vrrp_script chk_http_port{
script "/usr/local/src/nginx_check.sh" #
interval 2? #檢測(cè)腳本執(zhí)行的間隔 (秒)
weight 2
}
5主備服務(wù)器配置 虛擬ip配置
vrrp_instance VI_1{
state MASTER? ? #服務(wù)器狀態(tài)? 主服務(wù)器 為MASTER? 備服務(wù)器為BACKUP
interface? ens33? #網(wǎng)卡的名字
virtual_router_id 51? ? #主備服務(wù)器的virtual_router_id 必須相同
priority? 100? ? ? ? #主備服務(wù)器取不同的優(yōu)先級(jí) 主服務(wù)器值較大赖钞,備份服務(wù)器較小
adver_int 1? #檢查服務(wù)器心跳 檢查服務(wù)器是否還在運(yùn)行 每隔一秒
authentication{? #校驗(yàn)方式 使用密碼校驗(yàn)
auth_type PASS
auth_pass 1111
}
virtual_ipaddress{
192.168.17.50? #vrrp H 虛擬IP地址
192.168.17.51? #vrrp H 虛擬IP地址
}
}
網(wǎng)卡名字查找? 使用ifconfig
6 配置腳本文件:/usr/local/src/nginx_check.sh
腳本文件內(nèi)容如下
#!/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
7啟動(dòng)nginx 啟動(dòng)keepalived
cd? /usr/local/nginx/sbin/
./nginx -s stop
./nginx
systemctl start keepalived.service
8 檢查進(jìn)程
ps -ef | grep keepalived
5 Nginx 原理
worker的工作情況
worker 爭(zhēng)搶獲取請(qǐng)求信息
一個(gè)master和多個(gè)worker的好處
1 可以使用nginx -是reload 熱部署,利于nginx進(jìn)行熱部署
2 worker 進(jìn)程來說聘裁,獨(dú)立的進(jìn)程雪营,不需要加鎖,省掉鎖帶來的開銷衡便,同事在編程以及問題查找時(shí)方便很多献起,采取獨(dú)立進(jìn)程可以讓相互之間不會(huì)影響,一個(gè)進(jìn)程退出镣陕,其他進(jìn)程正常工作谴餐,服務(wù)不會(huì)中斷,master進(jìn)程很會(huì)啟動(dòng)新的worker進(jìn)程呆抑,我worker進(jìn)程異常退出岂嗓,導(dǎo)致當(dāng)前worker的所有請(qǐng)求失敗,但不會(huì)影響其他worker的請(qǐng)求
3 設(shè)置多少worker才合適 nginx同redis類似都采用io多路復(fù)用機(jī)制每個(gè)worker都是一個(gè)獨(dú)立的進(jìn)程鹊碍,每個(gè)進(jìn)程只有一個(gè)主進(jìn)程
worker數(shù)量一般和cpu的數(shù)量一致最好
4 連接數(shù) 并發(fā)數(shù)
發(fā)送一個(gè)請(qǐng)求會(huì)占用幾個(gè)連接數(shù) :2個(gè) 或4個(gè)
nginx有一個(gè)master 有4個(gè)worker每個(gè)worker支持最大的鏈接數(shù)據(jù)時(shí)1024 支持最大并發(fā)數(shù)是多少
普通靜態(tài)訪問最大并發(fā)數(shù)? worker_connection * worker_processes /2
如果是http作為反向代理 最大并發(fā)數(shù) worker_connection * worker_processes /4