Nginx教程

Nginx簡介

什麼是nginx

Nginx 是一個高性能的HTTP和反向代理服務器。php

特色是佔用內存少,併發能力強,理論上能支持高達50000個併發鏈接數。html

能夠作什麼

做爲Web服務器

Nginx能夠做爲靜態頁面的web服務器,同時還支持CGI協議的動態語言,如perl,php等。可是不支持java, java須要經過tomcat配合。java

正向代理

Nginx能夠做爲正向代理來進行上網功能。linux

正向代理:若是把局域網外的Internet想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet, 則須要經過代理服務器來訪問,這種代理服務器就稱爲正向代理。nginx

正向代理須要客戶端配置代理服務器進行指定網站訪問。c++

反向代理

Nginx能夠做爲反向代理服務器。web

反向代理中,客戶端對代理是無感知的。由於客戶端不須要任何配置就能夠訪問。請求發送到反向代理服務器後,由反向代理服務器去選擇目標服務器,獲取數據後返回給客戶端。正則表達式

反向代理服務器和真實服務器對外就是一臺服務器,暴露的是代理服務器的地址,隱藏了真實服務器的地址。redis

負載均衡

增長服務器的數量,將請求分發到各個服務器上,將原來請求集中到單個服務器上的狀況改成將請求分發到多個服務器上,將負載分發到不一樣的服務器上,也就是咱們所說的負載均衡。算法

動靜分離

爲了加快網站的解析速度,能夠把動態頁面和靜態頁面由不一樣的服務器來解析,加快解析速度,下降原來單個服務器的壓力。

Nginx安裝

本次安裝在虛擬機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本體

下載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系統是訪問不了的。須要另外配置一下防火牆。

這裏先介紹幾個關於防火牆的命令

  1. 查看防火牆狀態
firewall-cmd --state
  1. 查看開放的端口號
firewall-cmd --list-all
  1. 開放端口號
firewall-cmd --add-port=80/tcp --permanent
  1. 關閉端口號
firewall-cmd --remove-port=80/tcp --permanent
  1. 重啓防火牆
firewall-cmd --reload

咱們能夠用上面的命令開放80端口,而後重啓防火牆,以後就能夠從linux系統外訪問了。

Nginx經常使用命令和配置文件

經常使用命令

進入到/usr/local/nginx/sbin目錄下執行

  1. 查看nginx版本號
./nginx -v
  1. 啓動nginx
./nginx
  1. 中止nginx
./nginx -s stop
  1. 從新加載配置文件
./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)進行匹配,對特定的請求進行處理。地址定向、數據緩存、應答控制等功能,許多第三方模塊也在這裏配置。

Nginx配置實例

反向代理

實例一

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 {

}
  1. =: 用於不含正則表達式的uri前,要求請求字符串與uri嚴格匹配,若是匹配成功,就中止繼續向下搜索並當即處理該請求。
  2. ~: 用於表示uri包含正則表達式,而且區分大小寫。
  3. ~*:用於表示ri包含正則表達式,而且不區分大小寫。
  4. ^~: 用於不含正則表達式的uri前,要求Nginx服務器找到標識uri和請求字符串匹配度最高的location後,當即使用此location處理請求,而再也不使用location塊中的正則uri和請求字符串作匹配。
    注意: 若是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原理

master和worker

worker如何工做

master-workers的好處

  1. 每一個worker進程都是獨立的,不須要加鎖,節省了鎖的開銷。在編程及查找問題時也會方便不少。
  2. 獨立的進程間不會相互影響。一個進程退出後,其餘進程還在工做,服務不會中斷,master進程則很快啓動新的worker進程。
  3. 當某個worker進程異常退出,會致使當前worker上全部請求失敗,可是不會影響到全部請求,因此下降了風險。
  4. nginx -s reload熱部署也得益於多個worker進程。

配置文件優化

設置worker_processes

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_connections表示每一個worker進程能創建的最大鏈接數。

一個nginx的最大鏈接數是worker_processes * worker_connections。

但最大併發數不是最大鏈接數。因爲每次請求佔用兩個鏈接,因此普通的靜態訪問最大併發數是最大鏈接數的一半,即worker_processes * worker_connections / 2;若是做爲反向代理,每一個併發須要創建與客戶端的鏈接和與後端服務器(如tomcat)的鏈接,那麼最大併發數還要再減半,即worker_processes * worker_connections / 4。

參考課程:https://www.bilibili.com/video/av68136734

相關文章
相關標籤/搜索