nginx簡介
什么是nginx
Nginx (engine x) 是一個高性能的HTTP和反向代理]web服務器擂达,同時也提供了IMAP/POP3/SMTP服務土铺。Nginx可以作為靜態(tài)頁面的web服務器,同時還支持CGI協(xié)議的動態(tài)語言,比如pexl舒憾、php等镀钓。但是不支持 java。Java 程序只能通過與tomcat配合完成镀迂。Nginx,專為性能優(yōu)化而開發(fā)丁溅,性能是其最重要的考量,實現上非常注重效率,能經受高負載的考驗,有報告表明能支持高達50,000個并發(fā)連接數探遵。
Linux安裝Nginx
安裝編譯工具和庫文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
安裝pcre
[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
[root@bogon src]# tar zxvf pcre-8.35.tar.gz
[root@bogon src]# cd pcre-8.35
[root@bogon pcre-8.35]# ./configure
[root@bogon pcre-8.35]# make && make install
[root@bogon pcre-8.35]# pcre-config --version
安裝nginx
官網下載地址https://nginx.org/en/download.html
[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz
[root@bogon src]# cd nginx-1.6.2
[root@bogon nginx-1.6.2]# ./configure
[root@bogon nginx-1.6.2]# make
[root@bogon nginx-1.6.2]# make install
[root@bogon nginx-1.6.2]# cd /usr/local/nginx/sbin
[root@bogon nginx-1.6.2]# ./nginx
訪問默認地址服務器ip地址:80
nginx常用命令
需要在nginx安裝目錄下的sbin
目錄下才能執(zhí)行命令
查看nginx版本號
[root@czsEdu01 sbin]# ./nginx -v
nginx version: nginx/1.12.2
啟動nginx
[root@czsEdu01 sbin]# ./nginx
關閉nginx
[root@czsEdu01 sbin]# ./nginx -s stop
重新加載nginx
[root@czsEdu01 sbin]# ./nginx -s reload
nginx.conf配置文件
位置/usr/local/nginx/conf
配置文件組成:
第一部分:全局塊
從配置文件開始到 events 塊之間的內容窟赏,主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)箱季、允許生成的 worker process 數涯穷,進程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等藏雏。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
worker_processes:這是 Nginx 服務器并發(fā)處理服務的關鍵配置拷况,worker_processes 值越大,可以支持的并發(fā)處理量也越多掘殴,但是
會受到硬件赚瘦、軟件等設備的制約
第二部分:events塊
events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化奏寨,是否允許同時接收多個網絡連接起意,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等病瞳。
events {
worker_connections 1024;
}
上述例子就表示每個 work process 支持的最大連接數為 1024. 這部分的配置對 Nginx 的性能影響較大揽咕,在實際中應該靈活配置。
第三部分:http塊
這算是 Nginx 服務器配置中最頻繁的部分套菜,代理亲善、緩存和日志定義等絕大多數功能和第三方模塊的配置都在這里。需要注意的是:http 塊也可以包括 http 全局塊逗柴、server 塊逗爹。
http 全局塊:配置的指令包括文件引入、MIME-TYPE 定義嚎于、日志自定義、連接超時時間挟冠、單鏈接請求數上限等于购。
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;
server塊:這塊和虛擬主機有密切關系,虛擬主機從用戶角度看知染,和一臺獨立的硬件主機是完全一樣的肋僧,該技術的產生是為了
節(jié)省互聯網服務器硬件成本。每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機嫌吠。而每個 server 塊也分為全局 server 塊止潘,以及可以同時包含多個 locaton 塊。
1辫诅、全局 server 塊
最常見的配置是本虛擬機主機的監(jiān)聽配置和本虛擬主機的名稱或 IP 配置凭戴。
2、location 塊
一個 server 塊可以配置多個 location 塊炕矮。
這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string)么夫,對虛擬主機名稱
(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理肤视。地址定向档痪、數據緩
存和應答控制等功能,還有許多第三方模塊的配置也在這里進行邢滑。
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
nginx反向代理
實現效果:使用 nginx 反向代理腐螟,訪問www.123.com
直接跳轉到 127.0.0.1:8080
修改host文件
C:\Windows\System32\drivers\etc\host
添加網址映射www.123.com
配置完成之后,我們便可以通過www.123.com:8080
訪問到第一步出現的 Tomcat 初始界面困后。那么如何只需要輸入 www.123.com
便可以跳轉到 Tomcat 初始界面呢乐纸?便用到 nginx的反向代理。
在 nginx.conf 配置文件中增加如下配置
<img src="https://gitee.com/czshh0628/blog-images/raw/master/image-20210503093924770.png" alt="image-20210503093924770" style="zoom: 150%;" />
如上配置操灿,我們監(jiān)聽 80 端口锯仪,訪問域名為 www.123.com
,不加端口號時默認為 80 端口趾盐,故訪問該域名時會跳轉到 127.0.0.1:8080 路徑上庶喜。在瀏覽器端輸入 www.123.com
結果如下:
重新加載nginx
[root@czsEdu01 sbin]# ./nginx -s reload
實現效果:使用 nginx 反向代理,根據訪問的路徑跳轉到不同端口的服務中
nginx 監(jiān)聽端口為 9001救鲤,訪問 http://192.168.80.100:9001/edu/
直接跳轉到 192.168.80.100:8080久窟,訪問 http://192.168.80.100:9001/vod/
直接跳轉到 192.168.80.100:8081
在 nginx.conf 配置文件中增加如下配置
<img src="https://gitee.com/czshh0628/blog-images/raw/master/image-20210503100639863.png" alt="image-20210503100639863" style="zoom:150%;" />
location指令說明
該指令用于匹配 URL。
- =:用于不含正則表達式的 uri 前本缠,要求請求字符串與 uri 嚴格匹配斥扛,如果匹配成功,就停止繼續(xù)向下搜索并立即處理該請求丹锹。
- ~:用于表示 uri 包含正則表達式稀颁,并且區(qū)分大小寫。
- ~*:用于表示 uri 包含正則表達式楣黍,并且不區(qū)分大小寫匾灶。
- ^~:用于不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字符串匹配度最高的 location 后租漂,立即使用此 location 處理請求阶女,而不再使用 location 塊中的正則 uri 和請求字符串做匹配颊糜。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識秃踩。
nginx負載均衡
實現效果:瀏覽器輸入http://192.168.80.100/edu/a.html
衬鱼,負載均衡將請求平均分攤到8080和8081端口
在 nginx.conf 配置文件中增加如下配置
隨著互聯網信息的爆炸性增長,負載均衡(load balance)已經不再是一個很陌生的話題憔杨,顧名思義鸟赫,負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性芍秆,又保證響應足夠快惯疙,給用戶很好的體驗⊙叮快速增長的訪問量和數據流量催生了各式各樣的負載均衡產品霉颠,很多專業(yè)的負載均衡硬件提供了很好的功能,但卻價格不菲荆虱,這使得負載均衡軟件大受歡迎蒿偎,nginx 就是其中的一個,在 linux 下有 Nginx怀读、LVS诉位、Haproxy 等等服務可以提供負載均衡服務,而且 Nginx 提供了幾種分配方式(策略):
輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器菜枷,如果后端服務器 down 掉苍糠,能自動剔除。
weight:weight 代表權,重默認為 1,權重越高被分配的客戶端越多啤誊,指定輪詢幾率岳瞭,weight 和訪問比率成正比,用于后端服務器性能不均的情況蚊锹。 例如:
upstream server_pool{
server 192.168.80.100:8080 weight=10;
server 192.168.80.100:8081 weight=10;
}
ip_hash:每個請求按訪問 ip 的 hash 結果分配瞳筏,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題牡昆。 例如:
upstream server_pool{
ip_hash;
server 192.168.80.100:8080;
server 192.168.80.100:8081;
}
fair(第三方):按后端服務器的響應時間來分配請求姚炕,響應時間短的優(yōu)先分配。
upstream server_pool{
server 192.168.80.100:8080;
server 192.168.80.100:8081;
fair;
}
nginx動靜分離
動靜分離介紹
Nginx 動靜分離簡單來說就是把動態(tài)跟靜態(tài)請求分開丢烘,不能理解成只是單純的把動態(tài)頁面和靜態(tài)頁面物理分離柱宦。嚴格意義上說應該是動態(tài)請求跟靜態(tài)請求分開,可以理解成使用 Nginx 處理靜態(tài)頁面播瞳,Tomcat 處理動態(tài)頁面捷沸。動靜分離從目前實現角度來講大致分為兩種,一種是純粹把靜態(tài)文件獨立成單獨的域名狐史,放在獨立的服務器上痒给,也是目前主流推崇的方案;另外一種方法就是動態(tài)跟靜態(tài)文件混合在一起發(fā)布骏全,通過 nginx 來分開苍柏。通過 location 指定不同的后綴名實現不同的請求轉發(fā)。通過 expires 參數設置姜贡,可以使瀏覽器緩存過期時間试吁,減少與服務器之前的請求和流量。具體 Expires 定義:是給一個資源設定一個過期時間楼咳,也就是說無需去服務端驗證熄捍,直接通過瀏覽器自身確認是否過期即可,所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新的文件豆村,不建議使用 Expires 來緩存)剩岳,我這里設置 3d,表示在這 3 天之內訪問這個 URL浪汪,發(fā)送一個請求,比對服務器該文件最后更新時間沒有變化,則不會從服務器抓取袱耽,返回狀態(tài)碼304,如果有修改干发,則直接從服務器重新下載朱巨,返回狀態(tài)碼 200。
在 nginx.conf 配置文件中增加如下配置
在根目錄下創(chuàng)建/data/www
和/data/image
存放靜態(tài)圖片和靜態(tài)頁面進行測試
nginx搭建高可用集群
高可用配置(主從配置)
準備工作
需要兩臺服務器192.168.80.129 和 192.168.80.131
在兩臺服務器安裝nginx
在兩臺服務器安裝 keepalived枉长,安裝之后冀续,在etc里面生成目錄 keepalived,有文件keepalived.conf
yum install keepalived –y
在/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
修改主服務器
keepalived.conf
配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(檢測腳本執(zhí)行的間隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 備份服務器上將 MASTER 改為 BACKUP
interface ens33 //網卡
virtual_router_id 51 # 主搀暑、備機的 virtual_router_id 必須相同
priority 100 # 主沥阳、備機取不同的優(yōu)先級,主機值較大自点,備份機值較小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虛擬地址
}
}
修改備用服務器
keepalived.conf
配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(檢測腳本執(zhí)行的間隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 備份服務器上將 MASTER 改為 BACKUP
interface ens33 //網卡
virtual_router_id 51 # 主桐罕、備機的 virtual_router_id 必須相同
priority 90 # 主、備機取不同的優(yōu)先級桂敛,主機值較大功炮,備份機值較小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虛擬地址
}
}
把兩臺服務器上 Nginx 和 keepalived 啟動
- 啟動 Nginx: ./nginx
- 啟動 keepalived: systemctl start keepalived.service
最終測試
- 在瀏覽器地址欄輸入 虛擬 ip 地址 192.168.17.50
- 把主服務器(192.168.17.129) Nginx 和 keepalived 停止,再輸入 192.168.17.50
高可用主從配置文件詳解
global_defs {
# 通過名字能訪問到主機
router_id LVS_DEVEL
}
vi /etc/host
表示每個2秒間隔執(zhí)行一次nginx_check.sh
檢查腳本术唬,當發(fā)現主服務器掛掉時薪伏,宕機服務器權重降低20
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(檢測腳本執(zhí)行的間隔)
weight -20
}
虛擬IP設置
vrrp_instance VI_1 {
state MASTER # 表示此服務器是主服務器還是備份服務器 主MASTER 備BACKUP
interface ens33 //網卡 # ipconfig的網卡名
virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
priority 100 # 主粗仓、備機取不同的優(yōu)先級嫁怀,主機值較大设捐,備份機值較小 主100 備機90
advert_int 1 # 每隔1秒發(fā)送心跳 檢測主機是否存活
authentication { # 權限校驗方式 密碼1111
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虛擬IP,可以綁定多個
192.168.17.50 // VRRP H 虛擬地址
}
}
腳本文件:檢測nginx是否存活塘淑,宕機把所有keepalived進程殺掉萝招,讓從服務器替代主服務器做相關請求
#!/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原理
master-workers 機制的好處
可以使用nginx –s reload熱部署,利用nginx進行熱部署操作
每個woker是獨立的進程存捺,如果有其中的一個woker出現問題槐沼,其他woker 獨立的,繼續(xù)進行爭搶捌治,實現請求過程岗钩,不會造成服務中斷
首先,對于每個 worker 進程來說肖油,獨立的進程兼吓,不需要加鎖,所以省掉了鎖帶來的開銷构韵,同時在編程以及問題查找時周蹭,也會方便很多。其次疲恢,采用獨立的進程凶朗,可以讓互相之間不會影響,一個進程退出后显拳,其它進程還在工作棚愤,服務不會中斷, master 進程則很快啟動新的worker進程杂数。當然宛畦, worker 進程的異常退出,肯定是程序有 bug 了揍移,異常退出次和,會導致當前 worker 上的所有請求失敗,不過不會影響到所有請求那伐,所以降低了風險踏施。
設置多少個 worker是最合適的
Nginx 同 redis 類似都采用了 io 多路復用機制,每個 worker 都是一個獨立的進程罕邀,但每個進程里只有一個主線程畅形,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話下诉探。每個 worker 的線程可以把一個 cpu 的性能發(fā)揮到極致日熬。所以 worker 數和服務器的cpu數相等是最為適宜的。設少了會浪費 cpu肾胯,設多了會造成 cpu 頻繁切換上下文帶來的損耗竖席。
#設置 worker 數量耘纱。
worker_processes 4
#work 綁定 cpu(4 work 綁定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
#work 綁定 cpu (4 work 綁定 8cpu 中的 4 個) 怕敬。
worker_cpu_affinity 0000001 00000010 00000100 00001000
連接數 worker_connection
發(fā)送請求揣炕,占用了woker的幾個連接數?
如果請求靜態(tài)資源就占用2個連接數东跪,如果是發(fā)送java請求,nginx要做反向代理去找tomcat鹰溜,因此會多2個連接數也就是4個
nginx有一個master虽填,有四個woker,每個woker支持最大的連接數1024曹动,支持的最大并發(fā)數是多少斋日?
4*1024/2
個并發(fā)數或者4*1024/4
個并發(fā)數
普通的靜態(tài)訪問最大并發(fā)數是:
worker_connections*worker_processes /2
如果是HTTP作為反向代理來說,最大并發(fā)數量應該是
worker_connections*worker_processes/4