主頁 > 軟體設計 > Nginx

Nginx

2023-03-13 07:36:09 軟體設計

一、Niginx是什么?

  • Nginx是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務,
  • Niginx是一款輕量級的web服務器/反向代理器,
  • Nginx是高性能的HTTP和 反向代理的web服務器,處理高并發的能力十分強大,能夠經受高負載的考驗,高達5萬個并發連接數,
  • Nginx支持熱部署,啟動簡單,可以做到 7 * 24小時不間斷運行,幾個月都不需要重新啟動,
  • Nginx采用 多行程(單執行緒)&多路IO復用模型,一個master行程和多個worker行程,woker行程的數量一般和CPU數量一致

二、Nginx的反向代理(正向代理)

 

 

解釋一下:

正向代理: 我們平時需要訪問國外的瀏覽器是不是很慢,比如我們要看推特,看GitHub等等,我們直接用國內的服務器無法訪問國外的服務器,或者是訪問很慢,所以我們需要在本地搭建一個服務器來幫助我們去訪問,那這種就是正向代理,(瀏覽器中配置代理服務器)

反向代理: 那什么是反向代理呢,比如:我們訪問淘寶的時候,淘寶內部肯定不是只有一臺服務器,它的內部有很多臺服務器,那我們進行訪問的時候,因為服務器中間session不共享,那我們是不是在服務器之間訪問需要頻繁登錄,那這個時候淘寶搭建一個過渡服務器,對我們是沒有任何影響的,我們是登錄一次,但是訪問所有,這種情況就是 反向代理,對我們來說,客戶端對代理是無感知的,客戶端不需要任何配置就可以訪問,我們只需要把請求發送給反向代理服務器,由反向代理服務器去選擇目標服務器獲取資料后,再回傳給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器的地址,(在服務器中配置代理服務器)

 

三、Nginx的負載均衡

什么是負載均衡?

負載均衡建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴展網路設備和服務器的帶寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性,
負載均衡(Load Balance)其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成作業任務,

簡單來說就是:現有的請求使服務器壓力太大無法承受,所有我們需要搭建一個服務器集群,去分擔原先一個服務器所承受的壓力,那現在我們有ABCD等等多臺服務器,我們需要把請求分給這些服務器,但是服務器可能大小也有自己的不同,所以怎么分?如何分配更好?又是一個問題,

Nginx提供的三種負載均衡的方式:

  1. 輪詢法(默認方法)
    每個請求按照時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除宕機的服務器,

     

    # 服務器三臺
    server1 server2 server3 請求過來,會按照時間順序逐一轉發 第一次請求 server1 第二次請求 server2 第三次請求 server3 第四次請求 server1 第五次請求 server2 第六次請求 server3 ,,,

     

  2. weight權重模式(加權輪詢)
    指定輪詢的幾率,weight和訪問比例成正比,用于后端服務器性能不均的情況,
    這種方式比較靈活,當后端服務器性能存在差異的時候,通過配置權重,可以讓服務器的性能得到充分發揮,有效利用資源、權重越大,被訪問的概率越大
    # 服務器三臺
    server1  1
    server2  1
    server3  3
    
    請求過來,會按照時間順序逐一轉發
    第一次請求 server1
    第二次請求 server2
    第三次請求 server3
    第四次請求 server3
    第五次請求 server3
    第六次請求 server1
    ,,,
  3. ip_hash
    上述方式存在一個問題,在負載均衡系統中,假如用戶在某臺服務器上登錄了,那么該用戶第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到服務器集群中的某一臺,那么已經登錄某個服務器的用戶再重新定位到另一個服務器,其登錄資訊將會丟失,這樣顯然不妥,
    我們可以采用ip_hash指令解決這個問題,如果用戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希演算法,自動定位到該服務器,每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題!

 四、Nginx的動態分離

Nginx的靜態處理能力很強,但是動態處理能力不足,因此,在企業中常用動靜分離技術,動靜分離技術其實是采用代理的方式,在server{}段中加入帶正則匹配的location來指定匹配項針對PHP的動靜分離:靜態頁面交給Nginx處理,動態頁面交給PHP-FPM模塊或Apache處理,在Nginx的配置中,是通過location配置段配合正則匹配實作靜態與動態頁面的不同處理方式
目前,通過使用Nginx大大提高了網站的回應速度,優化了用戶體驗,讓網站的健壯性更上一層樓!

 

 

 

五、Nginx的安裝

yum install nginx

組態檔

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;




    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        # root         /root/xj/data/mysite;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

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

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

 

啟動nginx

systemctl start nginx

訪問80埠,效果如下:

 

 

六、Nginx常用命令

whereis nginx  # 查看nginx路徑
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz


啟動:/user/sbin/nginx
指定檔案啟動:/user/sbin/nginx -c /etc/nginx/nginx.conf

停止:/user/sbin/nginx -s stop

安全退出:/user/sbin/nginx -s quit
重新加載:/user/sbin/nginx -s reload 如果修改了組態檔,就需要重新加載 



或者:
systemctl start nginx
systemctl restart nginx
systemctl stop nginx

 

七、Nginx檔案結構

...              #全域塊

events {         #events塊
   ...
}

http      #http塊
{
    ...   #http全域塊
    server        #server塊
    { 
        ...       #server全域塊
        location [PATTERN]   #location塊
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全域塊
}

 

  • 1、全域塊:配置影響nginx全域的指令,一般有運行nginx服務器的用戶組,nginx行程pid存放路徑,日志存放路徑,組態檔引入,允許生成worker process數等,

    user  nobody;  # nginx運行的用戶身份,一般要么注釋掉,要么把nobody 改成 www 或 nginx
    worker_processes auto;  # 作業行程數,(如果是雙核4執行緒,可以設定為4,一般建議和CPU的邏輯核數量一致)
    error_log /var/log/nginx/error.log;  # 全域指定nginx錯誤日志的存放目錄
    pid /run/nginx.pid;  # 指定nginx的pid檔案目錄

     

  • 2、events塊:配置影響nginx服務器或與用戶的網路連接,有每個行程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網路連接序列化等,

    worker_connections 1024;  
    # 最大可以調整到100,000以上, nginx的最大并發連接數 = worker_processes * worker_connections(行程數*連接數)

     

  • 3、http塊:可以嵌套多個server,配置代理,快取,日志定義等絕大多數功能和第三方模塊的配置,如檔案引入,mime-type定義,日志自定義,是否使用sendfile傳輸檔案,連接超時時間,單連接請求數等,

    # 匯入mime.types模塊,讓nginx能夠識別各種各樣的檔案資源
    include       mime.types;
    # nginx默認識別的mime.types,默認采用二進制資料格式,
    default_type application/octet-stream;
    ?
    # 設定客戶端訪問nginx的訪問日志格式
    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;
    ?
    # Nginx在進行資料傳輸,會呼叫sendfile()函式, Linux 2.0+ 以后的推出的一個系統呼叫,
    # 對比一般的資料的網路傳輸sendfile會有更少的切換和更少的資料拷貝,
    sendfile       on;
    tcp_nopush     on;
    ?
    # 客戶端保持連接時間
    #keepalive_timeout 0;
    keepalive_timeout  65;
    ?
    # 開啟網路傳輸的資料gzip壓縮[會額外消耗一定的cpu資源,但是會節約大量的出口帶寬來提高訪問速度,gzip壓縮演算法的使用會帶來一定的安全隱患,不建議壓縮圖片和大檔案]
    gzip on;
    #低于1kb的資源不壓縮
    gzip_min_length 1k;
    ?
    # 設定壓縮級別,級別范圍:1~9,數字越大壓縮率越高,同時消耗cpu資源也越多,建議設定在5左右,
    gzip_comp_level 5;
    # 指定壓縮哪些MIME型別的靜態資源,多個空格隔開,不建議壓縮圖片,視頻等二進制檔案
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
    # web站點的虛擬主機,類似python的虛擬環境,這里的配置,會讓nginx自動提供一個站點給外界訪問
    ?
    # 指定包含的組態檔
    # 可以設定多個 server 模塊
    include /etc/nginx/conf.d/*.conf;

     

  • 4、server塊:配置虛擬主機的相關引數,一個http中可以有多個server,

    server {
            # 站點的訪問埠,要允許外界訪問,還需要設定防火墻
            listen       80;
            # 站點的訪問域名地址
            server_name  www.luffycity.dabanyu.com;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
            # 地址模式匹配,location后面的是訪問url路徑,相當于django的正則路由一樣,
            # 地址匹配成功以后,則會呼叫當前花括號的配置資訊
            location / {
                # root 表示當前站點所在目錄
                root   html;
            # index 指定默認首頁
                index  main.html main.htm;
            }
            ...
        }

     

     

  • 5、location塊:配置請求的路由,以及各種頁面的處理情況,

    在proxy_pass 中的代理url后加上/,代理轉發的url中就不會帶著location中匹配路徑;
    如果后面沒有/,代理轉發的url中就會帶上location中的匹配路徑

     

    我們訪問 http://my.yemao.com/proxy/index.html,其實是訪問到了 http://test.yemao.com/index.html

     

我們訪問 http://my.yemao.com/proxy/index.html,其實是訪問到了 http://test.yemao.com/proxy/index.html,這里將 location 中 匹配的 proxy 也自動加到了 代理轉發的地址后面

同理:在使用 upstream定義后臺服務器時,效果就類似于沒有在轉發后面加上/

upstream backend {
    server 127.0.0.1:9999;
}

proxy_pass http://backend;   ==> 等價于  http://test.yemao.com/proxy/index.html

 

如果nginx代理的三個服務器都要在埠*:80上監聽,那么nginx首先決定那個服務器應該處理請求:

[注解]  listen 監聽某個ip和埠,并根據傳來的請求中“Host”欄位匹配server_name,然后轉給server_name 服務器去處理
server {
    listen      80; # 監聽埠
    server_name example.org www.example.org; # 服務器名稱
    ...
}

server {
    listen      80;# 監聽埠
    server_name example.net www.example.net;# 服務器名稱
    ...
}

server {
    listen      80;# 監聽埠
    server_name example.com www.example.com;# 服務器名稱
    ...
}

 

nginx是根據請求中的"Host"欄位來決定應當將這個客戶端的請求轉發給哪一個web服務器,這個"Host"的值應當是與某一個server_name 相匹配的,

但是, 如果其值與任何服務器的 server_name 都不匹配,或者請求根本不包含"Host"欄位,則nginx會將請求轉發到此埠的默認服務器, 在上面的配置中,默認服務器是第一個 ,這是nginx的標準默認行為,

它也可以使用listen指令中的default_server引數明確設定哪個服務器應該是默認的,如下所示 example.net www.example.net 將是默認的 server_name:如果一個server_name都匹配不上,則會將請求轉給默認服務器

 

server {
    listen      80 default_server; # 監聽埠, 此服務器為默認服務器
    server_name example.net www.example.net; # 服務器名稱
    ...
}

 

請注意,默認服務器是監聽埠(listen)的屬性,而不是 server_name 的屬性,

如果客戶端的請求中沒有"Host"欄位,那么我們可以定義組態檔,來扔掉這類的客戶端請求,

如下的配置中,server_name 設定為一個空字串,它將匹配沒有“Host”頭欄位的請求,并回傳一個特殊的nginx非標準代碼444來關閉連接,

server {
    listen      80;
    server_name "";
    return      444;
}

 

不同ip地址的服務器:

# 第一個服務器
server {
    listen      192.168.1.1:80; # 監聽此ip的80埠
    server_name example.org www.example.org; # 服務器名
    ...
}

# 第二個服務器
server {
    listen      192.168.1.1:80 default_server; # 監聽此ip的80埠
    server_name example.net www.example.net; # 服務器名,為此ip,埠的默認服務器
    ...
}

# 第三個服務器
server {
    listen      192.168.1.2:80 default_server; # 監聽此ip的80埠
    server_name example.com www.example.com; # 服務器名,為此ip,埠的默認服務器
    ...
}

 

在上面的配置中,nginx首先根據配置中的serverlisten指令監聽請求的ip地址和埠

然后,在監聽此IP和埠的server中找到與請求中“Host”欄位匹配的server_name , 讓這個server_name 來處理請求,如果沒有找到匹配的server_name,則由默認服務器處理該請求,

例如,在 192.168.1.1:80 埠上收到的 host 為 www.example.com 請求將由192.168.1.1:80埠的默認服務器處理,即由第二臺服務器處理,因為192.168.1.1:80 埠上沒有名為 www.example .com 的 server_name,

 

現在我們知道了nginx 配置中是如何選擇服務器來處理請求的了

那么在指定的服務器中,由哪一個location 來處理請求呢? 下面的配置中有3個location

匹配location 的程序如下:

location匹配命令

  • ~ : 表示執行一個正則匹配,區分大小寫

  • ~*: 表示執行一個正則匹配,不區分大小寫

  • ^~: 表示普通字符匹配,如果該選項匹配,則只匹配該選項,其他選項不匹配,一般用于匹配目錄

  • = : 表示普通字符精確匹配

  • @: 定義一個自命名的location用于內部定向時使用,列如 error_page, try_files

優先級:

  1. =前綴的指令嚴格匹配這個查詢,如果找到,停止搜索,

  2. 所有剩下的常規字串,最長的匹配,如果這個匹配使用^?前綴,搜索停止,

  3. 正則運算式,在組態檔中定義的順序,

  4. 如果第3條規則產生匹配的話,結果被使用,否則,使用第2條規則的結果,

 

首先,nginx 不管location 的順序,而是從location 中找到與請求的url 最匹配、最具體的這個location 前綴,

/ 根目錄能夠匹配到所有的請求,也就是說,所有的請求都可以由 / 根目錄的這個location 來處理, 因此 / 根目錄的location 是在沒有其他的location 匹配這個url 的時候,才會由它處理該請求,

其次,nginx 檢查由正則運算式組成的location ,一旦找到匹配的location , 則停止查找,由此location 來處理該請求,

server {
    listen      80; # 監聽本機的80埠
    server_name example.org www.example.org; # 服務器名
    root        /data/www;   

    location / { # 這里的 / 表示匹配所有的路徑
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ { # 這里表示為,不區分大小寫的正則匹配,匹配以gif、jpg、png結尾的請求
        expires 30d;
    }

    location ~ \.php$ { # 這里的正則表示,匹配以php結尾的請求
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
 

需要注意的是,只匹配請求url中的非引數部分,這是因為,引數可以有很多種方式給出,例如:

/index.php?user=john&page=1
/index.php?page=1&user=john
/index.php?page=1&something+else&user=john # 查詢字串中的內容種類太多了,不好匹
 

舉幾個例子看看上面的nginx配置是如何處理請求的吧,

  1. 請求url “/logo.gif”首先與location 前綴“/” 匹配,也與正則運算式 “.(gif|jpg|png)”匹配,因此,它由第二個location處理, 使用指令"root" /data/www 將請求映射到檔案/data/www/logo.gif,并將該檔案回傳給客戶端,

  2. 請求url“/index.php”首先和lcoation 前綴 "/“匹配,也與正則運算式 “.php$ " 匹配,因此,由第三個location來處理請求,請求被傳遞給監聽localhost:9000的FastCGI服務器, fastcgi_param指令將FastCGI引數SCRIPT_FILENAME設定為“/data/www/index.php”,FastCGI服務器執行該檔案, 變數等于指令的值(),變數 fastcgi_script_name等于請求URI (”/index.php”),

  3. 請求“/about.html”僅與location前綴 “/” 匹配,因此,該請求由此locatoin處理, 使用 “root” 指令(值 /data/www)將請求映射到檔案/data/www/about.html,并將檔案回傳給客戶端,

  4. 請求“/”僅與 location前綴 “/” 匹配,因此該請求由此location處理,然后索引指令根據其引數和 “root” 指令的值/data/www查找檔案是否存在, 如果檔案/data/www/index.html不存在,并且檔案/data/www/index.php存在,則指令執行內部重定向到“/index.php”,并且nginx再次搜索位置 如果請求是由客戶發送的, 正如我們之前看到的,重定向的請求最終將由FastCGI服務器處理,

八、Nginx引數詳解

worker_processes

woker_processes   1|auto;  # 指定nginx作業時的行程數,設定值小于CPU的核數

worker_connections

worker_connections 1024  # 設定Nginx的最大連接數

keepalive_timeout

keepalive_timeout    65;   # http連接超時時間,默認是65s,當需要上傳大檔案時,避免檔案上傳程序中斷開連接,導致檔案上傳失敗

gzip

gzip    on;    # 對網路傳輸的資料內容進行壓縮

upstream

# 默認為輪詢
upstream backend{
        server    101.35.241.220:8001;
        server    150.158.153.179:8002;
        server    42.194.147.234:8003;
    }

第一個請求 101.35.241.220:8001
第二個請求 150.158.153.179:8002
第三個請求 42.194.147.234:8003
...
    
# 設定權重
upstream backend{
        server    101.35.241.220:8001 weight=1;
        server    150.158.153.179:8002 weight=2 max_fails=2 fail_timeout=2;;
        server    42.194.147.234:8003 weight=1 max_fails=2 fail_timeout=1;
    }

# 請求會按照權重進行轉發
第一個請求 101.35.241.220:8001
第二個請求 150.158.153.179:8002
第三個請求 150.158.153.179:8002
第四個請求 42.194.147.234:8003
第四個請求 101.35.241.220:8001
,,,
max_fails=2:允許請求失敗的次數,默認為1,當超過最大次數時,回傳proxy_next_upstream模塊定義的錯誤,
fail_timeout=1:在經歷了max_fails次失敗后,暫停服務的時間,max_fails可以和fail_timeout一起使用,
# 熱備和下線 upstream backend{ server 101.35.241.220:8001; server 150.158.153.179:8002 down; server 42.194.147.234:8003 backup; } # 150.158.153.179:8002 down 不參與轉發 # 42.194.147.234:8003 backup 只有在主服務器掛掉,才會生效

server

server {
        listen       80;  # 監聽的埠
        server_name  localhost;  # 宣告server_name,Host請求頭命中server_name才會走這個server
        
        #charset koi8-r;
        
        #access_log  logs/host.access.log  main;
        
        location / {  # 所有的請求都在走這里
            root   html;  # 指定根目錄
            index  index.html index.htm;
            proxy_pass http://backend;  # 請求轉發
            proxy_redirect default;
            proxy_set_header    Host    $host;
            proxy_set_header    X_Real_IP    $remote_addr;
            proxy_set_header    X_Forwarded_For    $proxy_add_x_forwarded_for;
            
        }
        
        #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;
        }   
}

注意點

 

# root
location ^~ /t/ {
     root /www/root/html/;
}
如果一個請求的url是/t/a.html,web服務器會回傳服務器上/www/root/html/t/a.html的檔案內容

# alias
location ^~ /t/ {
 alias /www/root/html/new_t/;
}
如果一個請求是/t/a.html,則web服務器會回傳服務器上/www/root/html/new_t/a.html



使用alias的時候,目錄名后面一定要加‘/’
alias在使用正則匹配的時候,必須捕獲要匹配的內容并在指定的內容處使用
alias只能位于location中,root可以不放在lication中
如果root在全域中和location中都存在,則優先location中的root

 

location

# 配置該服務的訪問規則,同一個server可以配置多個location

= 表示精確匹配
^~ 表示uri以指定字符或者字串開頭的前綴匹配,不是正則匹配,一旦匹配則不在查找其他匹配項
~ 表示區分大小寫的匹配大小寫的正則匹配
~* 表示不區分大小寫的正則匹配
/ 表示通用匹配,如果沒有其他匹配,任何請求都會匹配到

規則優先級:
= 高于 ^~ 高于 ~* 等于 ~ 高于 /

 

九、負載均衡

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;  # 將請求轉發到 定義的服務器里串列中
        }
    }
}

在上面的示例中,在srv1-srv3上運行了3個相同應用程式的實體, 如果沒有指明配置負載均衡的方法,則默認為回圈方式實作負載均衡, 所有請求都代理到服務器組myapp1,nginx應用HTTP負載平衡來分發請求,要為HTTPS而不是HTTP配置負載均衡,只需使用“https”作為協議,更多詳情見 nginx負載均衡官方檔案 http://nginx.org/en/docs/http/load_balancing.html

nginx 組態檔的含義見 菜鳥教程-nginx https://www.runoob.com/w3cnote/nginx-setup-intro.html

nginx 負載均衡,反向代理 : https://www.runoob.com/w3cnote/nginx-proxy-balancing.html

Nginx 服務器安裝及組態檔詳解 https://www.cnblogs.com/bluestorm/p/4574688.html 根據上面了解到的知識,修改 /usr/local/nginx/conf/nginx.conf 為如下:

########### 每個指令必須有分號結束,#################
user root; # 配置用戶或用戶組,否則有可能會出錯
worker_processes auto; # 允許生成的行程數,默認為1
error_log /var/log/nginx/error.log warn; # 指定日志路徑,級別,這個設定可以放入全域塊,http塊,server塊,級別依次為:debug|info|notice|warn|error|crit|alert|emerg
pid /run/nginx.pid; # 指定nginx行程運行檔案存放地址
 
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events { # events塊
    worker_connections 1024; # 最大連接數,默認為512
}

http { # http塊
    include             /etc/nginx/mime.types; # 檔案擴展名與檔案型別映射表
    default_type        application/octet-stream;  # 默認檔案型別,默認為text/plain
    # 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  /var/log/nginx/access.log  main;
    sendfile            on; # 允許sendfile方式傳輸檔案,默認為off,可以在http塊,server塊,location塊,
    # tcp_nopush          on; 
    # tcp_nodelay         on;
    keepalive_timeout   65; #連接超時時間,默認為75s,可以在http,server,location塊,
    # types_hash_max_size 2048;
    
    # 設定負載均衡后臺服務器串列, backend可以修改為其它名字
    upstream backend {
        #ip_hash; # 指定負載均衡的方式,3種,默認為輪詢,
        server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ; # 30秒錯誤2次,這臺服務器就掛掉
        server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
        server 127.0.0.1:8027;
        server 127.0.0.1:8028;
        server 127.0.0.1:8029;
    }
    
    server { # server塊
        listen       80; # 通過80埠訪問nginx時
        server_name  localhost; # 服務器名,監聽地址
        location / { # location塊,# 請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫,對以 / 所有地址進行負載均衡
            root html;  # 定義服務器的默認網站根目錄位置,如果locationURL匹配的是子目錄或檔案,root沒什么作用,一般放在server指令里面或/下
            # index index.html;  #定義路徑下默認訪問的檔案名,一般跟著root放
            # proxy_pass  http://mysvr; 請求轉向backend定義的服務器串列,即反向代理,設定被代理服務器的埠或套接字以及URL
            # deny 127.0.0.1;  #拒絕的ip
            # allow 172.18.5.54; #允許的ip   
            include uwsgi_params;
            uwsgi_pass backend;    # 非集群設定的是uWSGI套接字地址,集群則直接使用負載均衡組名
            # uwsgi_pass 127.0.0.1:5000;  # 非集群時使用,如果配合uwsgi使用,則這里要和uwsgi.ini中的socket一致
        }
        
        location /static/ { # 請求靜態檔案時,將回傳/home/myproject/static/xxx 
            alias /home/myproject/static;    
        }

        error_page 404 /404.html; # 錯誤頁
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html; # 錯誤頁
            location = /50x.html {
        }
    }
  }

 

本文來自博客園,作者:暮歌行,轉載請注明原文鏈接:https://www.cnblogs.com/xuejian123/p/17209047.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/546649.html

標籤:架構設計

上一篇:怎么利用異步設計提升系統性能?

下一篇:Nginx

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more