Nginx 是一個高性能的HTTP和反向代理服務器。php
特色是佔用內存少,併發能力強,理論上能支持高達50000個併發鏈接數。html
Nginx能夠做爲靜態頁面的web服務器,同時還支持CGI協議的動態語言,如perl,php等。可是不支持java, java須要經過tomcat配合。java
Nginx能夠做爲正向代理來進行上網功能。linux
正向代理:若是把局域網外的Internet想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet, 則須要經過代理服務器來訪問,這種代理服務器就稱爲正向代理。nginx
正向代理須要客戶端配置代理服務器進行指定網站訪問。c++
Nginx能夠做爲反向代理服務器。web
反向代理中,客戶端對代理是無感知的。由於客戶端不須要任何配置就能夠訪問。請求發送到反向代理服務器後,由反向代理服務器去選擇目標服務器,獲取數據後返回給客戶端。正則表達式
反向代理服務器和真實服務器對外就是一臺服務器,暴露的是代理服務器的地址,隱藏了真實服務器的地址。redis
增長服務器的數量,將請求分發到各個服務器上,將原來請求集中到單個服務器上的狀況改成將請求分發到多個服務器上,將負載分發到不一樣的服務器上,也就是咱們所說的負載均衡。算法
爲了加快網站的解析速度,能夠把動態頁面和靜態頁面由不一樣的服務器來解析,加快解析速度,下降原來單個服務器的壓力。
本次安裝在虛擬機CentOS 7.6 64位系統中進行。
先安裝gcc環境,perl庫,zlib,openssl等
#nginx編譯依賴gcc環境 yum install -y gcc-c++ #pcre:(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式 yum install -y pcre pcre-devel #該庫提供了不少種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip yum install -y zlib zlib-devel #一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。nginx不只支持http協議,還支持https(即在ssl協議上傳輸http) yum install -y openssl openssl-devel
下載nginx-1.16.1.tar.gz,上傳到服務器中/usr/local目錄下
解壓並進入源碼目錄
tar -zxf nginx-1.16.1.tar.gz cd nginx-1.16.1
編譯
./configure make make install
啓動
cd /usr/local/nginx/sbin ./nginx
本地訪問
因爲Linux防火牆默認不容許訪問80端口,因此咱們用虛擬機外的windows系統是訪問不了的。須要另外配置一下防火牆。
這裏先介紹幾個關於防火牆的命令
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --remove-port=80/tcp --permanent
firewall-cmd --reload
咱們能夠用上面的命令開放80端口,而後重啓防火牆,以後就能夠從linux系統外訪問了。
進入到/usr/local/nginx/sbin目錄下執行
./nginx -v
./nginx
./nginx -s stop
./nginx -s reload
配置文件默認在/usr/local/nginx/conf目錄下,主要是nginx.conf。後續對nginx的使用基本都是對此配置文件的修改。
配置文件內容大體分爲三個部分
1 全局塊
從文件開始到events塊之間的內容,主要是設置一些nginx服務器總體參數。包括運行nginx服務器的用戶(組),容許生成的worker process數,進程PID存放路徑,日誌存放路徑和類型,配置文件的引入等。
好比
worker_processes 1;
這是併發處理服務的關鍵配置,值越大,可支持的併發處理量越多,會受到軟硬件制約。
2 events塊
主要涉及nginx服務器與用戶的網絡鏈接。包括是否開啓對多worker process下的網絡鏈接進行序列化,是否容許同時接收多個網絡鏈接,選取哪一種事件驅動模型來處理鏈接請求,每一個work process能夠同時支持的最大鏈接數等。
好比
events { worker_connections 1024; }
表示每一個work process支持的最大鏈接數爲1024
3 http塊
這是nginx服務器配置中最頻繁的部分,代理、緩存、日誌等大多數功能和第三方模塊的配置都在這裏。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
http塊能夠分爲http全局塊和server塊
3.1 http全局塊
http全局塊配置包括文件引入、MIME-TYPE定義、日誌自定義、鏈接超時時間、單連接請求數上限等。
3.2 server塊
這裏和虛擬主機有關。從用戶角度看,虛擬主機和一臺獨立的硬件主機是同樣的。該技術是爲了節約互聯網服務器硬件成本。
每一個http塊包括多個server塊,每一個server塊就至關於一個虛擬主機。
每一個server塊又分爲其全局server塊和配置多個location塊
3.2.1 全局server塊
主要是配置本虛擬主機的監聽信息、虛擬主機的名稱、IP
3.2.2 location塊
一個server塊能夠配置多個location塊
這裏的主要做用是基於nginx服務器收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱(或IP別名)以外的字符串(如/uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存、應答控制等功能,許多第三方模塊也在這裏配置。
1 在linux中安裝tomcat,解壓並進入tomcat bin目錄, ./start.sh啓動tomcat服務器
2 因爲tomcat默認端口8080,須要防火牆開放此端口
firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
到這裏應該能在windows中經過ip:端口訪問linux中的tomcat服務器
3 修改nginx配置文件,進行轉發配置
server { listen 80; server_name 192.168.17.129; location / { proxy_pass http://127.0.0.1:8080; } }
4 修改windows系統的hosts文件,進行域名和ip的對應關係配置
192.168.17.129 www.123.com
5 最終效果
在windows系統瀏覽器輸入www.123.com,訪問到linux中的tomcat服務器
1 準備兩個tomcat,一個8080端口,一個8081端口。
在8080tomcat的webapps目錄下建立edu目錄,在edu目錄下新建a.html頁面,該頁面打印"8080!!";
在8081tomcat的webapps目錄下建立vod目錄,在vod目錄下新建a.html頁面,該頁面打印"8081!!"。
2 nginx反向代理配置
server { listen 9001; server_name 192.168.17.129; location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; } }
location指令說明
該指令用於匹配URL,語法以下
location [ = | ~ | ~* | ^~] uri { }
3 對外開放 8080 8081 9001 端口
4 最終效果
訪問 http://192.168.17.129:9001/edu/a.html 跳轉到 127.0.0.1:8080/edu/a.html
訪問 http://192.168.17.129:9001/vod/a.html 跳轉到 127.0.0.1:8081/vod/a.html
1 準備兩臺tomcat,一個8080端口,一個8081端口。
在兩臺tomcat中webapps目錄下建立edu文件夾,在edu文件夾下建立a.html頁面,內容不一樣便於測試
2 在nginx.conf進行配置
upstream myserver { server 192.168.17.129:8080; server 192.168.17.129:8081; } server { listen 80; server_name 192.168.17.129; location / { proxy_pass http://myserver; } }
nginx負載均衡策略
1) 輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
2) weight
weight表明權重,默認爲1.權重越高被分配的次數越多。
weight和訪問比率成正比,用於後端服務器性能不均的狀況,如
upstream myserver { server 192.168.17.129:8081 weight=10; server 192.168.17.129:8082 weight=5; }
3) ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客訪問固定的後端服務器,能夠解決session的問題。如
upstream myserver { ip_hash; server 192.168.17.129:8081; server 192.168.17.129:8082; }
4) fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。如
upstream myserver { server 192.168.17.129:8081; server 192.168.17.129:8082; fair; }
3 最終效果
瀏覽器中訪問http://192.168.17.129/edu/a.html,訪問會平均到8080端口和8081端口中。
動靜分離簡單來講就是把動態請求和靜態請求分開。靜態資源和動態資源不一樣服務器處理。
Nginx經過location指定不一樣的後綴名實現不一樣的請求轉發。
1 在linux系統中準備靜態資源。
image目錄下放一個01.jpg圖片,www目錄下放一個a.html文件。
2 在nginx配置文件中配置location
server { listen 80; server_name 192.168.17.129; location /www/ { root /data/; } location /image/ { root /data/; autoindex on; } }
3 最終效果
瀏覽器中訪問http://192.168.17.129/image/01.jpg
因爲配置了autoindex on,咱們能夠查看image目錄
瀏覽器中訪問http://192.168.17.129/www/a.html
架構圖
1 準備工做
準備兩個linux,nginx,keepalived。
2 安裝軟件
假設兩個linux的ip分別爲 192.168.17.129 和 192.168.17.131
在兩個linux上安裝nginx
在兩個linux上安裝keepalived
yum install keepalived -y
3 配置keepalived.conf
修改兩個/etc/keepalived/keepalived.conf,主備的keepalived配置主要是state和priority屬性不一樣。
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 #(檢測腳本執行的間隔) weight 2 } vrrp_instance VI_1 { state MASTER # 備份服務器上將 MASTER 改成 BACKUP interface ens33 //網卡 virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同 priority 100 # 主、備機取不一樣的優先級,主機值較大,備份機值較小(如90) advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.17.50 // VRRP H 虛擬地址 } }
在/usr/local/src下添加檢測腳本
#!/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
4 啓動軟件
分別啓動兩個linux的nginx和keepalived
啓動nginx
./nginx
啓動keepalived
systemctl start keepalived.service
5 最終效果
在瀏覽器中訪問虛擬ip地址 192.168.17.50
把主服務器(192.168.17.129)的nginx和keepalived中止,再訪問 192.168.17.50
Nginx同redis相似採用了io多路複用機制。每一個worker都是獨立的進程,每一個進程裏只有一個主線程,經過異步非阻塞的方式處理請求,能夠處理成千上萬的請求。
每一個worker的線程能夠把一個cpu的性能發揮到極致,故worker數和服務器的cpu數相等是最爲適宜的。設置少了會浪費cpu,多了會形成cpu頻繁切換上下文的消耗。
設置worker
worker_processes 4 #worker綁定cpu(4 worker 綁定 4 cpu) worker_cpu_affinity 0001 0010 0100 1000
這裏說明一下:Nginx默認未開啓多核,配置worker_cpu_affinity參數來充分利用多核cpu。
1) 假設2 cpu,開啓2進程
worker_processes 2; worker_cpu_affinity 01 10;
2) 假設4 cpu,開啓4進程
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
3) 假設8 cpu,開啓8進程
worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
總之,有多少核數總位數就有多少個,從右往左,1表示開啓對應cpu核。
worker_connections表示每一個worker進程能創建的最大鏈接數。
一個nginx的最大鏈接數是worker_processes * worker_connections。
但最大併發數不是最大鏈接數。因爲每次請求佔用兩個鏈接,因此普通的靜態訪問最大併發數是最大鏈接數的一半,即worker_processes * worker_connections / 2;若是做爲反向代理,每一個併發須要創建與客戶端的鏈接和與後端服務器(如tomcat)的鏈接,那麼最大併發數還要再減半,即worker_processes * worker_connections / 4。
參考課程:https://www.bilibili.com/video/av68136734