天天看點

Nginx必掌握之核心技術

前提準備

​虛拟機安裝

注意:安裝虛拟機是為了在本地虛拟化Linux環境,便于學習。對應了實際應用場景中,企業的雲伺服器

  • 本地安裝虛拟機Vmware、Virtualbox、Parallls

    我這裡隻找到了mac版本的​vmware-fusion (opens new window),是以就使用這個版本了

  • 系統CentOS 7.4

    ​​​官網 (opens new window)​​下載下傳适合自己的版本

  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
版本 說明
DVD ISO 标準安裝版
Everything ISO 對完整版安裝盤的軟體進行補充,內建所有軟體。(包含​​centos7 (opens new window)​​的一套完整的軟體包,可以用來安裝系統或者填充本地鏡像)
Minimal ISO 精簡版,自帶的軟體最少
NetInstall ISO 網絡安裝鏡像(從網絡安裝或者救援系統)
  • 使用虛拟機,安裝CentOS鏡像

    第一步、把鏡像安裝到Vmware,把下載下傳的鏡像拖到Vmware中

  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • 第二步、Vmware安裝好鏡像,進入CentOS系統配置
  • 選擇語言
  • Nginx必掌握之核心技術
  • 确認系統安裝位置
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • 開始安裝,安裝過程中設定root密碼,安裝完成後重新開機
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • Nginx必掌握之核心技術
  • 賬号root,密碼就是上一步設定的密碼
  • Nginx必掌握之核心技術
  • 登陸後
  • Nginx必掌握之核心技術

​配置虛拟機網絡

ip addr #檢視網絡      

1

可以看到兩個網卡 ​

​lo​

​​和​

​ens33​

​(lo是本地網卡)

Nginx必掌握之核心技術

使用vi編輯器打開​

​ens33​

​​網絡的配置檔案,修改啟動配置(如何使用vi編輯器:​

​i​

​​修模式改資料,​

​esc​

​​退出,​

​:wq​

​儲存退出vi編輯器)

vi /etc/sysconfig/network-scripts/ifcfg-ebs33      

1

Nginx必掌握之核心技術

重新開機網絡

systemctl restart network      

1

就能看到ens33被配置設定在了網絡IP(192.168.174.128),但是這個網路是動态配置設定的内網位址,重新開機後會一直變化。

Nginx必掌握之核心技術

​克隆虛拟機

打開虛拟機資源庫

Nginx必掌握之核心技術

兩種克隆方式,選擇哪種都可以将前面配置的虛拟機克隆出來新的

Nginx必掌握之核心技術

​使用SSH連接配接虛拟機

使用SSH可以友善的在本地連接配接遠端雲伺服器(對應的就是我們這裡裝在本地的虛拟機),對其進行

SSH軟體很多,比如Xshell,他們的使用都大同小異,我這裡使用的是Mac上的Termius,

建立連接配接

Nginx必掌握之核心技術

主機位址就是雲伺服器的公網位址,對應就是上面本地虛拟機ens33這個網卡的位址,與公網位址不同,這個位址是内網位址,每次重新開機都會動态配置設定,是以我們使用這個位址連結上

Nginx必掌握之核心技術

修改固定IP

這一步僅僅是因為,ens33這個網卡的位址,每次重新開機都會動态配置設定,是以我們使用這個位址每次都需要修改SSH工具的“主機名”,是以,我們改成固定的。(如果你使用的是雲伺服器,使用公網IP連接配接,這個公網IP是不會變化的,就不用這一步)

還是進入ens33網卡的配置檔案

vi /etc/sysconfig/network-scripts/ifcfg-ens33      

1

增加一下配置(如果想要了解這些是啥,需要自行了解下計算機網絡的基本知識)

IPADDR=192.168.174.120 # 設定IP
NETMASK=225.225.225.0 #子網路遮罩
GATEWAY=192.168.174.1 #網關
DNS1=8.8.8.8 # DNS伺服器位址      

1

2

3

4

修改檔案中BOOTPROTO字段為static後,後IP就固定為了IPADDR的值

BOOTPROTO=static #原來值是dhcp,就是動态擷取ip的一個協定      

1

​Nginx介紹

  • Nginx開源版 http://nginx.org/en/

    官方原始的Nginx版本

  • Nginx plus商業版

    開箱即用,內建了大量功能

  • Open Resty https://openresty.org/cn/

    OpenResty是一個基于Nginx與 Lua 的高性能 Web 平台,其内部內建了大量精良的 Lua 庫、第三方子產品以及大多數的依賴項。更适用于需要大量二次開發的場景,有極強的擴充性

  • Tengine https://tengine.taobao.org/

    由淘寶網發起的Web伺服器項目。它在​​​Nginx (opens new window)​​​的基礎上,針對大通路量網站的需求,添加了很多進階功能和特性。Tengine的性能和穩定性已經在大型的網站如​​淘寶網 (opens new window)​​​,​​天貓商城 (opens new window)​​等得到了很好的檢驗。相比于Open Resty,擴充性不夠強,但是能夠滿足絕多數使用場景

​Nginx安裝

  • 下載下傳Nginx包

    ​​​官網下載下傳位址(opens new window)​​

  • Nginx必掌握之核心技術
  • 使用FTP工具将檔案上傳到虛拟機中

    Termius也提供了FTP的功能,直接将下載下傳的Nginx包拖拽到主機目錄中,我這裡是放到了root目錄下

  • Nginx必掌握之核心技術
  • 解壓Nginx包,并安裝
tar -zxvf  nginx-1.21.6.tar.gz #解壓到目前目錄

cd nginx-1.21.6 #進入解壓後的檔案夾
ls #檔案夾中的檔案:auto     CHANGES.ru  configure  html     man     src CHANGES  conf        contrib    LICENSE  README      

安裝依賴庫

#安裝C編譯器
yum install -y gcc

#安裝pcre庫
yum install -y pcre pcre-devel

#安裝zlib
yum install -y zlib zlib-devel      

安裝

./configure --prefix=/usr/local/nginx #使用prefix選項指定安裝的目錄
make
make install      

啟動

cd /usr/local/nginx/sbin

ls # 裡面是一個nginx的可執行檔案

./nginx # 啟動這個可執行      

關閉防火牆

systemctl stop firewalld      

補充Nginx指令

./nginx -s stop #快速停止
./nginx -s quit #完成已接受的請求後,停止
./nginx -s reload #重新加載配置
./nginx -t #檢查nginx配置是否正确      

檢視nginx狀态

ps -ef|grep nginx      

啟動時:

停止時:

  • 注冊系統服務

    通過系統服務的方式啟動nginx

vim usr/lib/systemd/system/nginx.service      
[Unit] 
Description=nginx
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit 
PrivateTmp=true
   
[Install]   
WantedBy=multi-user.target  # 多使用者      

​Nginx 目錄

conf #配置檔案
  |-nginx.conf # 主配置檔案
  |-其他配置檔案,都被引入到了nginx.conf
html #靜态頁面
logs
  |-access.log #通路日志(每次通路都會記錄)
  |-error.log #錯誤日志
  |-nginx.pid #程序号
sbin
  |-nginx #主程序檔案
*_temp #運作時,生成臨時檔案      
Nginx必掌握之核心技術

​Nginx配置

後面學習Nginx配置,每次修改配置檔案,一定要重載才能生效

systemctl reload nginx      

1

​簡化版的nginx.conf

worker_processes  1; # 啟動的worker程序數

events {
    worker_connections  1024; #每個worker程序的連接配接數
}


http {
    include       mime.types; #include是引入關鍵字,這裡引入了mime.types這個配置檔案(同在conf目錄下,mime.types是用來定義,請求傳回的content-type)
    default_type  application/octet-stream; #mime.types未定義的,使用預設格式application/octet-stream

    sendfile        on; #詳情,見下文
    keepalive_timeout  65; #長連結逾時時間
    
        #一個nginx可以啟用多個server(虛拟伺服器)
    server {
        listen       80;#監聽端口80
        server_name  localhost;  #接收的域名

        location / { 
            root   html; #根目錄指向html目錄
            index  index.html index.htm; #域名/index 指向 index.html index.htm檔案
        }

        error_page   500 502 503 504  /50x.html; # 伺服器錯誤碼為500 502 503 504,轉到"域名/50x.html"
        location = /50x.html {# 指定到html檔案夾下找/50x.htm
            root   html;
        }

    }
}      

sendfile

打開sendfile,使用者請求的資料不用再加載到nginx的記憶體中,而是直接發送

Nginx必掌握之核心技術

​Nginx配置使用場景

修改nginx配置檔案後,記得重新加載nginx

systemctl reload nginx      

不同二級域名,映射到不同靜态網頁

可以寫多個server字段,從前向後比對,先比對到哪個就用哪個

使用者通路​

​pro.hedaodao.ltd​

​​,就會走到第一個server配置;​

​test.hedaodao.ltd​

​走到第二個配置

http {
    #....其他屬性
    server {
        listen       80;
        server_name  pro.hedaodao.ltd;

        location / { 
            root   html/pro; 
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }}

    server {
        listen       80;
        server_name  test.hedaodao.ltd;

        location / { 
            root   html/test; 
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }}
}      

不同域名,映射到同一靜态頁面

server_name

  • 可以寫多個,用空格分開
  • 使用通配符(*)
  • 使用正規表達式(https://blog.csdn.net/yangyelin/article/details/112976539)
http{    
    server {
        listen       80;
        server_name  *.hedaodao.ltd  ~^[0-9]+\.hedaodao\.ltd$; # "\."是轉譯"."

        location / { 
            root   html/test; 
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }}
}      

​反向代理與負載均衡

反向代理:這種代理方式叫做,隧道代理。有性能瓶頸,因為所有的資料都經過Nginx,是以Nginx伺服器的性能至關重要

Nginx必掌握之核心技術

負載均衡:把請求,按照一定算法規則,配置設定給多台業務伺服器(即使其中一個壞了/維護更新,還有其他伺服器可以繼續提供服務)

Nginx必掌握之核心技術

​反向代理+負載均衡

nginx.conf配置檔案

啟用proxy_pass,root和index字段就會失效

proxy_pass後的位址必須寫完整 ​

​http://xxx​

​,不支援https

當通路localhost時(Nginx伺服器),網頁打開的是​

​http://xxx​

​(應用伺服器),網頁位址欄寫的還是localhost

http{    
    server {
        listen       80;
        server_name  localhost;

        location / { 
            proxy_pass http://xxx;
            #root   html/test; 
            #index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }}
}      

**定義位址别名 **

使用upstream定義一組位址【在server字段下】

通路localhost,通路都會代理到​

​192.168.174.133:80​

​​和​

​192.168.174.134:80​

​這兩個位址之一,每次通路這兩個位址輪着切換(後面講到,因為預設權重相等)

http{
  upstream httpds{
    server 192.168.174.133:80; #如果是80端口,可以省略不寫
    server 192.168.174.134:80;}
  server {
        listen       80;
        server_name  localhost;

        location / { 
            proxy_pass http://httpds;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }}
}      

設定權重

通路使用哪個位址的權重

upstream httpds{
    server 192.168.174.133:80 weight=10;
    server 192.168.174.134:80 weight=80;
}      

關閉

upstream httpds{
    server 192.168.174.133:80 weight=10 down;
    server 192.168.174.134:80 weight=80;
}      

備用機

如果​

​192.168.174.133:80​

​出現故障,無法提供服務,就用使用backup的這個機器

upstream httpds{
    server 192.168.174.133:80 weight=10;
    server 192.168.174.134:80 weight=80 backup;
}      

​動靜分離

當使用者請求時,動态請求配置設定到Tomcat業務伺服器,靜态資源請求放在Nginx伺服器中

例子:

  • 如果請求的資源位址是​

    ​location/​

    ​​,​

    ​/​

    ​的優先級比較低,如果下面的location沒比對到,就會走http://xxx這個位址的機器
  • 如果請求的資源位址是​

    ​location/css/*​

    ​,就會被比對到nginx的html目錄下的css檔案夾中(我們把css靜态資源放在這個位置)
server {
        listen       80;
        server_name  localhost;
        
        location / { # /的優先級比較低,如果下面的location沒比對到,就會走http://xxx這個位址的機器
            proxy_pass http://xxx;
        }
        
        location /css {  # root指的是html,location/css指的是root下的css,是以位址就是html/css
            root html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}      

使用正則

location ~*/(js|css|img){
  root html;
  index  index.html index.htm;
}      

​URL重寫

rewrite是URL重寫的關鍵指令,根據regex(正規表達式)部分内容,重定向到replacement,結尼是flag标記。

rewrite    <regex>   <replacement>  [flag];
關鍵字        正則        替代内容     flagt标記

正則:per1森容正規表達式語句進行規則比對
替代内容:将正則比對的内容替換成replacement

flag标記說明:
last  #本條規則比對完成後,繼續向下比對新的1ocation URI規則
break #本條規則比對完成即終止,不再比對後面的任何規則

redirect #傳回302臨重定向,遊覽器位址會顯示跳轉後的URL位址
permanent #傳回301永久重定向,測覽器位址欄會顯示跳轉後的URL位址      

浏覽器位址欄通路 ​

​xxx/123.html​

​​實際上是通路​

​xxx/index.jsp?pageNum=123​

server {
        listen       80;
        server_name  localhost;
        
        location / { 
            rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1  break;
            proxy_pass http://xxx;
        }
      

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}      

​網關伺服器

Nginx必掌握之核心技術

上圖中,應用伺服器,不能直接被外網通路到,隻能通過Nginx伺服器進行通路(使用proxy_pass),這時候這台Nginx伺服器就成為了網關伺服器(承擔入口的功能)

是以,我們啟動應用伺服器的防火牆,設定其隻能接受這台Nginx伺服器的請求

添加rich規則

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.174.135" port protocol="tcp" port="8080" accept" #這裡的192.168.174.135是網關 伺服器位址      

移除rich規則

firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"      

重新開機

移除和添加規則都要重新開機才能生效

firewall-cmd --reload      

檢視所有規則

firewall-cmd --list-all #所有開啟的規則      

​防盜鍊

當我們請求到一個頁面後,這個頁面一般會再去請求其中的靜态資源,這時候請求頭中,會有一個refer字段,表示目前這個請求的來源,我們可以限制指定來源的請求才傳回,否則就不傳回,這樣可以節省資源

Nginx必掌握之核心技術
valid_referers none|server_name      

設定有效的refer值

  • none:檢測位址沒有refer,則有效
  • server_name:檢測主機位址,refer顯示是從這個位址來的,則有效(server_name必須是完整的​

    ​http://xxxx​

    ​)

注意:​

​if ($invalid_referer)​

​中if後有個空格,不寫就會報錯

nginx: [emerg] unknown directive "if($invalid_referer)" in /usr/local/nginx/conf/nginx.conf:27      

例子:這裡設定nginx伺服器中的img目錄下的圖檔必須refer為http:192.168.174/133才能通路

server {
        listen       80;
        server_name  localhost;
        
        location / { 
            proxy_pass http://xxx;
        }
      
        location /img{
                valid_referers http:192.168.174/133;
                if ($invalid_referer){#無效的
                        return 403;#傳回狀态碼403
                }
                root html;
                index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}      

如果引用這張圖檔的頁面且refer并沒有被設定,圖檔無法加載出來

如果直接通路圖檔位址,因為沒有refer字段指向來源,會直接顯示Nginx的頁面

Nginx必掌握之核心技術

設定盜鍊圖檔

将提示圖檔放在html/img/x.png,通路設定防盜鍊圖檔時,就傳回這x.png張圖

location /img{
                valid_referers http:192.168.174/133;
                if ($invalid_referer){#無效的
                     rewrite ^/  /img/x.png break;
                }
                root html;
                index  index.html index.htm;
}      

​高可用場景

Nginx必掌握之核心技術

使用者通路時,通路的是一個虛拟IP,keepalived會標明一個主伺服器使用這個虛拟IP

每台機器上的keepalived會互相通信,根據其他機器上的keepalived程序是否存在,判斷伺服器狀态,如果預設的Master停止了,就會在剩下的Backup機器中,競選出一台Nginx伺服器作為Master

安裝keepalived

yum install -y keepalived      

修改keepalived配置

  • 配置檔案在/etc/keepalived/keepalived.conf
  • ​vrrp_instance​

    ​​、​

    ​authentication​

    ​​、​

    ​virtual_router_id​

    ​​、​

    ​virtual_ipaddress​

    ​這幾個一樣的機器,才算是同一個組裡。這個組才會選出一個作為Master機器

這裡我們設定兩台機器,分别下載下傳好keepalived,然後進行配置

機器一:

! Configuration File for keepalived

global_defs {
   router_id lb1 # 名字與其他配置了keepalive的機器不重複就行
}

vrrp_instance heyingjie {#vrrp執行個體名可以随意取
    state MASTER #隻能有一個預設的Master,其他寫BACKUP
    interface ens33 # ip addr檢視下網卡名,預設時ens33
    virtual_router_id 51
    priority 100 # 多台安裝了keepalived的機器競争成為Master的優先級
    advert_int 1 #通信時間
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16 #虛拟IP
    }
}      

機器二:

! Configuration File for keepalived

global_defs {
   router_id lb2 
}

vrrp_instance heyingjie {
    state BACKUP #隻能有一個預設的Master,其他寫BACKUP
    interface ens33 
    virtual_router_id 51
    priority 50
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16 #虛拟IP
    }
}      

通過指令​

​ip addr​

​檢視機器一的ip資訊,可以看到虛拟IP

Nginx必掌握之核心技術

​配置證書

購買伺服器——>購買域名,并解析到這個主機——>購買證書,綁定到域名上,并且把證書檔案安裝到伺服器,并在Nginx上配置好

這時候,這個域名就可以使用https進行通路裡(​

​https://xxxx​

​),浏覽器上會有一個小鎖

Nginx必掌握之核心技術

上面的流程我比較熟悉了,就直接跳過了,這裡直接寫申請到證書後的Nginx配置部分

下載下傳證書檔案

Nginx必掌握之核心技術
Nginx必掌握之核心技術
server {
  listen 443 ss1;
  
  ss1 certificate  xxx.pem; #這裡是證書路徑
  ss1_ certificate_key  xxx.key  #這裡是私鑰路徑
}      

繼續閱讀