我也來總結一下nginx知識點

oliver-l發表於2020-10-15

最近想深入學習研究一下nginx相關知識,所以下以下內容總結以下。

什麼是nginx?

Nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外Nginx可以作為反向代理進行負載均衡的實現。

nginx優勢

1、可以高併發連線

官方測試Nginx能夠支撐5萬併發連線,實際生產環境中可以支撐2~4萬併發連線數。

原因,主要是Nginx使用了最新的epoll(Linux2.6核心)和kqueue(freeBSD)網路I/O模型,而Apache使用的是傳統的Select模型,其比較穩定的Prefork模式為多程式模式,需要經常派生子程式,所以消耗的CPU等伺服器資源,要比Nginx高很多。

2、記憶體消耗少

Nginx+PHP(FastCGI)伺服器,在3萬併發連線下,開啟10個Nginx程式消耗150MB記憶體,15MB10=150MB,開啟的64個PHP-CGI程式消耗1280記憶體,20MB64=1280MB,加上系統自身消耗的記憶體,總共消耗不到2GB的記憶體。
如果伺服器的記憶體比較小,完全可以只開啟25個PHP-CGI程式,這樣PHP-CGI消耗的總記憶體數才500MB。

3、成本低廉

購買F5BIG-IP、NetScaler等硬體負載均衡交換機,需要十多萬到幾十萬人民幣,而Nginx為開源軟體,採用的是2-clause BSD-like協議,可以免費試用,並且可用於商業用途。

BSD開源協議是一個給使用者很大自由的協議,協議指出可以自由使用、修改原始碼、也可以將修改後的程式碼作為開源或專用軟體再發布。

4、配置檔案非常簡單

網路和程式一樣通俗易懂,即使,非專用系統管理員也能看懂。

5、支援Rewrite重寫

能夠根據域名、URL的不同,將http請求分到不同的後端伺服器群組。

6、內建的健康檢查功能

如果NginxProxy後端的某臺Web伺服器當機了,不會影響前端的訪問。

7、節省頻寬

支援GZIP壓縮,可以新增瀏覽器本地快取的Header頭。

8、穩定性高

用於反向代理,當機的概率微乎其微。

9、支援熱部署

Nginx支援熱部署,它的自動特別容易,並且,幾乎可以7天*24小時不間斷的執行,即使,執行數個月也不需要重新啟動,還能夠在不間斷服務的情況下,對軟體版本進行升級。

nginx配置引數

參考Nginx 配置常用引數,看這一篇就夠了

以我檢視寶塔中的nginx.conf配置為例

## 主模組
# 配置使用者或者組
user  www www;

#Nginx開啟的worker程式數,建議為CPU的核數
worker_processes auto;

#指定日誌路徑,級別。這個設定可以放入全域性塊、http塊、server塊,級別以此為:#debug|info|notice|warn|error|crit|alert|emerg
error_log  /www/wwwlogs/nginx_error.log  crit;

#指定nginx程式執行檔案存放地址
pid        /www/server/nginx/logs/nginx.pid;

#配置Nginx worker程式最大開啟檔案數
worker_rlimit_nofile 51200;

##事件模組
events
    {
        #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建議設定,nginx會自行選擇
        use epoll;

        #最大連線數,預設為512
        worker_connections 51200;

        #設定一個程式是否同時接受多個網路連線,預設為off
        multi_accept on;

        #設定網路連線序列化,防止驚群現象發生,預設為
        #on accept_mutex on;

        #預設: 500ms 如果一個程式沒有互斥鎖,它將延遲至少多長時間。預設情況下,延遲是500ms。 
        #accept_mutex_delay 100ms;
    }

#http模組
http
    {
        #副檔名與檔案型別對映表
        include       mime.types;

        #include luawaf.conf;

        #引入proxy.conf配置為nginx代理相關配置,配置內容如下
        include proxy.conf;

        # 預設檔案型別,預設為text/plain
        default_type  application/octet-stream;

        #儲存伺服器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的
        server_names_hash_bucket_size 512;

        #設定請求緩衝
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;

        #上傳檔案的大小限制 預設1m
        client_max_body_size 50m;

        #允許sendfile方式傳輸檔案,預設為off
        sendfile   on;
        #資料包不會馬上傳送出去,等到資料包最大時,一次性的傳輸出去,這樣有助於解決網路堵塞。當使用sendfile函式時,tcp_nopush才起作用
        tcp_nopush on;

        #連線超時時間,預設為75s
        keepalive_timeout 60;

        #使緩衝區中的資料立即傳送
        tcp_nodelay on;

        #指定連線到後端FastCGI的超時時間
        fastcgi_connect_timeout 300;

        #指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手後向FastCGI傳送請求的超時時間
        fastcgi_send_timeout 300;

        #指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手後接收FastCGI應答的超時時間
        fastcgi_read_timeout 300;

        #指定讀取FastCGI應答第一部分需要用多大的緩衝區
        fastcgi_buffer_size 64k;

        #指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求
        fastcgi_buffers 4 64k;

        fastcgi_busy_buffers_size 128k;
        #表示在寫入快取檔案時使用多大的資料塊,預設值是fastcgi_buffers的兩倍。
        fastcgi_temp_file_write_size 256k;

        #是否傳遞4xx和5xx錯誤資訊到客戶端,或者允許nginx使用error_page處理錯誤資訊
        fastcgi_intercept_errors on;

        ##開啟gzip資源壓縮
        gzip on;

        #當返回內容大於此值時才會使用gzip進行壓縮,K為單位,當值為0時,所有頁面都進行壓縮。
        gzip_min_length  1k;

        #設定用於處理請求壓縮的緩衝區數量和大小
        gzip_buffers     4 16k;

        #用於識別http協議的版本,早期的瀏覽器不支援gzip壓縮,使用者會看到亂碼,所以為了支援前期版本加了此選項。預設在http/1.0的協議下不開啟gzip壓縮。
        gzip_http_version 1.1;

        #設定gzip壓縮級別,級別越底壓縮速度越快檔案壓縮比越小,反之速度越慢檔案壓縮比越大
        gzip_comp_level 2;

        #設定需要壓縮的MIME型別,如果不在設定型別範圍內的請求不進行壓縮
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;

        #增加響應頭"Vary: Accept-Encoding"
        gzip_vary on;

        #Nginx做為反向代理的時候啟用:
        #off – 關閉所有的代理結果資料壓縮
        #expired – 如果header中包含”Expires”頭資訊,啟用壓縮
        #no-cache – 如果header中包含”Cache-Control:no-cache”頭資訊,啟用壓縮
        #no-store – 如果header中包含”Cache-Control:no-store”頭資訊,啟用壓縮
        #private – 如果header中包含”Cache-Control:private”頭資訊,啟用壓縮
        #no_last_modified – 啟用壓縮,如果header中包含”Last_Modified”頭資訊,啟用壓縮
        #no_etag – 啟用壓縮,如果header中包含“ETag”頭資訊,啟用壓縮
        #auth – 啟用壓縮,如果header中包含“Authorization”頭資訊,啟用壓縮
        #any – 無條件壓縮所有結果資料
        gzip_proxied   expired no-cache no-store private auth;

        #通過表示式,表明哪些UA頭不使用gzip壓縮
        gzip_disable   "MSIE [1-6]\.";

        #請求限制,對單個ip、單個會話同時存在的連線數的限制。這裡定義一個儲存區conn_zone,conn_zone的容量是1m,該儲存區針對於變數$binary_remote_add生效,這裡是針對單個IP生效。
        limit_conn_zone $binary_remote_addr zone=perip:10m;

        #針對域名限制
        limit_conn_zone $server_name zone=perserver:10m;

        #隱藏版本號
        server_tokens off;

        #關閉access_log,即不記錄訪問日誌
        access_log off;

#server{} 包含在http{}內部,每一個server{}都是一個虛擬主機(站點)
server
    {
        #監聽埠為888,可以自定義其他埠,也可以加上IP地址
        listen 888;

        #定義網站域名,可以寫多個,用空格分隔
        server_name phpmyadmin;

        #預設訪問檔案
        index index.html index.htm index.php;

        #定義網站根目錄,目錄可以是相對路徑也可以是絕對路徑
        root  /www/server/phpmyadmin;

        #定義404頁面
        #error_page   404   /404.html;
        include enable-php.conf;

        #匹配以gif,jpg,jpeg,png,bmp,swf結尾的請求
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            #控制頁面使用快取,快取時間為30天
            expires 30d;
        }

        #匹配以js,cssf結尾的請求
        location ~ .*\.(js|css)?$
        {
            #控制頁面使用快取,快取時間為12小時
            expires 12h;
        }

        #匹配禁止訪問
        location ~ /\.
        {
            deny all;
        }

        #定義訪問日誌,可以針對每一個server(即每一個站點)設定它們自己的訪問日誌
        access_log  /www/wwwlogs/access.log;
    }
#引入該目錄下所有以.conf結尾的配置檔案    
include /www/server/panel/vhost/nginx/*.conf;
}

proxy.conf內容如下

#儲存從代理伺服器接收到的資料的臨時檔案定義目錄
proxy_temp_path /www/server/nginx/proxy_temp_dir;

#表示快取檔案存放的路徑,該路徑是預先就要建立好的
#(levels=1:2 :   設定在相對於path指定目錄的第幾級hash目錄中快取資料,levels=1,表示一級hash目錄,levels=12,表示兩級hash目錄,目錄的名稱是基於請求URL通過雜湊演算法得到的)
#(keys_zone=cache_one:500m : 設定快取名字)
#(inactive=1d   : 強制更新時間,在指定時間內沒人訪問,就刪除快取)
#(max_size=30g  : 設定硬碟中快取資料的大小限制,最大快取空間)
proxy_cache_path /www/server/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=5g;

#處理客戶端請求體buffer大小,用來處理POST提交資料,上傳檔案等。client_body_buffer_size 需要足夠大以容納如果需要上傳POST資料
client_body_buffer_size 512k;

#設定與upstream server的連線超時時間,有必要記住,這個超時不能超過75秒。
proxy_connect_timeout 60;

#設定與代理伺服器的讀超時時間。它決定了nginx會等待多長時間來獲得請求的響應。
proxy_read_timeout 60;

#設定了傳送請求給upstream伺服器的超時時間。超時設定不是為了整個傳送期間,而是在兩次write操作期間。如果超時後,upstream沒有收到新的資料,nginx會關閉連線
proxy_send_timeout 60;

#Nginx使用該大小申請read_buf,即大小指定了 upstream header 最大長度,如果響應頭超過了這個長度,Nginx會報upstream sent too big header錯誤,然後client收到的是502。
proxy_buffer_size 32k;

#設定儲存被代理伺服器響應的body所佔用的buffer個數和每個buffer大小。具體的意思是說,開闢4個長度為64k大小的read_buf用來儲存body,當然不是連線建立初始化時就開闢4個,而是噹噹前buf不夠存響應body時才會新申請一個,最多申請4個buf。
proxy_buffers 4 64k;

#nginx會在沒有完全讀完後端響應就開始向客戶端傳送資料,所以它會劃出一部分busy狀態的buffer來專門向客戶端傳送資料(建議為proxy_buffers中單個緩衝區的2),然後它繼續從後端取資料。proxy_busy_buffer_size引數用來設定處於busy狀態的buffer有多大。
proxy_busy_buffers_size 128k;

#一次訪問能寫入的臨時檔案的大小,預設是proxy_buffer_size和proxy_buffers中設定的緩衝區大小的2倍
proxy_temp_file_write_size 128k;

#指定method在轉發到代理伺服器的請求中使用的HTTP 
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;

## 使用快取區 cache_one
proxy_cache cache_one;

laravel專案的nginx配置

server
{
    #監聽80埠
    listen 80;

    #監聽443,使用ssl協議
    listen 443 ssl http2;

    #定義網站域名
    server_name test.com;

    #預設訪問檔案
    index index.php index.html index.htm default.php default.htm default.html;

    #根目錄
    root /www/wwwroot/test/public;

    #強制使用https,當監聽埠不為443時,重寫路由
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    #配置ssl證照
    ssl_certificate    /www/server/panel/vhost/cert/test.com/fullchain.pem;

    #配置ssl祕鑰
    ssl_certificate_key    /www/server/panel/vhost/cert/test.com/privkey.pem;

    #用於限制連線,使其僅包括SSL / TLS的強版本和密碼
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

    ssl_prefer_server_ciphers on;

    #設定儲存會話引數的快取的型別和大小
    ssl_session_cache shared:SSL:10m;

    #指定客戶端可以重用會話引數的時間
    ssl_session_timeout 10m;
    # 定義497錯誤提示頁面
    error_page 497  https://$host$request_uri;

    #PHP-INFO-START  PHP引用配置,可以註釋或修改
    include enable-php.conf;
    #PHP-INFO-END

    #laravel的URL重寫規則
    location / {  
        try_files $uri $uri/ /index.php$is_args$query_string;  
    }

    #禁止訪問的檔案或目錄
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一鍵申請SSL證照驗證目錄相關設定
    location ~ \.well-known{
        allow all;
    }

    #匹配以gif,jpg,jpeg,png,bmp,swf結尾的請求並新增快取時間為30天
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log off;
        access_log /dev/null;
    }

    #匹配以js,css結尾的請求並新增快取時間為12小時
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log off;
        access_log /dev/null; 
    }
    #訪問日誌
    access_log  /www/wwwlogs/test.com.log;
    #錯誤日誌
    error_log  /www/wwwlogs/test.com.error.log;
}

enable-php.conf內容如下

#匹配url中包含.php的請求
location ~ [^/]\.php(/|$)
{
#查詢檔案,若檔案不存在返回404
try_files $uri =404;

#將請求轉發給fastcgi管理程式處理
fastcgi_pass  unix:/tmp/php-cgi-72.sock;

#如果請求的URI是以 / 結束的, 該指令設定的檔案會被附加到URI的後面並儲存在變數$fastcig_script_name中
fastcgi_index index.php;

#設定fastcgi請求中的引數,具體設定的東西可以在$_SERVER中獲取到

#指令碼檔案請求的路徑
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

#請求的引數
fastcgi_param  QUERY_STRING       $query_string;

#請求的動作(GET,POST)
fastcgi_param  REQUEST_METHOD     $request_method;

#請求頭中的Content-Type欄位
fastcgi_param  CONTENT_TYPE       $content_type;

#請求頭中的Content-length欄位
fastcgi_param  CONTENT_LENGTH     $content_length;

#指令碼名稱
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

#請求的地址不帶引數
fastcgi_param  REQUEST_URI        $request_uri;

#與$uri相同。
fastcgi_param  DOCUMENT_URI       $document_uri;

#網站的根目錄。在server配置中root指令中指定的值
fastcgi_param  DOCUMENT_ROOT      $document_root;

#請求使用的協議,通常是HTTP/1.0HTTP/1.1
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

#獲取請求協議如http或https
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

#cgi 版本
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

#nginx 版本號,可修改、隱藏
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

#客戶端IP
fastcgi_param  REMOTE_ADDR        $remote_addr;

#客戶端埠
fastcgi_param  REMOTE_PORT        $remote_port;

#伺服器IP地址
fastcgi_param  SERVER_ADDR        $server_addr;

#伺服器埠
fastcgi_param  SERVER_PORT        $server_port;

# #伺服器名,域名在server配置中指定的server_name 
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

#設定指令碼名稱
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
        set $real_script_name $1;
        set $path_info $2;
 }
 #設定自定義變數
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}

location,rewrite語法配置

Nginx教程(四) Location配置與ReWrite語法
Nginx中的Rewrite的重定向配置與實踐

nginx常用命令

幫助命令:nginx -h
檢視程式: ps aux | grep nginx
檢查配置檔案:nginx -t
檢視nginx版本和模組:nginx -V
啟動Nginx伺服器 :sudo nginx
指定啟動配置檔案:sudo nginx -c /usr/local/nginx/conf/nginx.conf
暴力停止服務:sudo nginx -s stop
優雅停止服務:sudo nginx -s quit
重新載入配置檔案:sudo nginx -s reload

nginx變數

參考nginx的變數

Nginx 的系統變數是由每一個編譯進Nginx的模組提供的。而使用者也可以自己定義變數。

常見的nginx 變數

變數 作用
arg_引數名 URL 中某個具體引數的值
query_string 與args變數完全相同
args 全部URL引數
is_args 如果請求的URL中有引數則返回?否則返回空
content_length HTTP 請求中標識包體長度的Content-Length頭部的值,頭部沒有這個則為空
content_type 標識請求包體型別的Content-Type 頭部的值
uri 請求的URI(不包含,不包含?後的引數)
document_uri 與uri完全相同
request_uri 請求的URL(包含?後的引數)
scheme 協議名 HTTP 或者 HTTPS
request_method 請求的方法GET 或者 POST
request_length 所有請求內容的大小,包括請求行,頭部,包體等
remote_user 有HTTP Basic Authentication 協議傳入的使用者名稱
request 原始的url請求,含有方法和協議版本

TCP相關的變數

變數 作用
binary_remote_addr 客戶端地質的整型格式,對於IPv4是4位元組
remote_addr 客戶端地址
remote_port 客戶端埠
connection 遞增的連線序號
connection_requests 當前連線上執行過的請求數,對keepalive 有意義
proxy_protocol_addr 若使用了proxy_protocol 協議則返回協議中的地址
proxy_protocol_port 若使用了proxy_protocol 協議則返回協議中的埠
server_addr 伺服器端地址(本端地址)
server_port 伺服器端埠
TCP_INFO tcp核心層引數($tcpinfo_rtt,$tcpinfo_rttvar,$tcpinfo_snd_cwnd,$tcpinfo_rcv_space)
server_protocol 服務端協議,例如 HTTP

Nginx 處理請求過程中產生的變數

變數 作用
request_time 請求處理到現在的耗時
server_name 匹配上的請求server_name
request_completion 若請求處理完則返回OK,否則為空
request_id 以16禁止輸出的請求標識id,隨即生成

Nginx系統變數

變數 作用
time_local 以本地時間的標準輸出
pid 所屬worker程式的id
hostname 與系統上輸出hostname 一致

虛擬主機配置

虛擬主機是一種特殊的軟硬體技術,它可以將網路上的每一臺計算機分成多個虛擬主機,每個虛擬主機可以獨立對外提供www服務,這樣就可以實現一臺主機對外提供多個web服務,每個虛擬主機之間是獨立的,互不影響

我也來總結一下nginx知識點

以上述在寶塔nginx配置路徑為例

基於主機多IP的方式

#在/www/server/panel/vhost/nginx目錄下建立一個ip1.conf
server
{
    listen 127.0.0.1:80;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

#在/www/server/panel/vhost/nginx目錄下建立一個ip2.conf
server
{
    listen 127.0.0.2:80;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

基於埠的配置方式

#在/www/server/panel/vhost/nginx目錄下建立一個port1.conf
server
{
    listen 80;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

#在/www/server/panel/vhost/nginx目錄下建立一個port2.conf
server
{
    listen 81;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

基於多個host名稱方式

#在/www/server/panel/vhost/nginx目錄下建立一個host1.conf
server
{
    listen 80;
    server_name www.test1.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

#在/www/server/panel/vhost/nginx目錄下建立一個host2.conf
server
{
    listen 80;
    server_name www.test2.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

nginx自帶模組使用

nginx可通過命令nginx -V檢視nginx已安裝的模組
我也來總結一下nginx知識點

–with-http_stub_status_module

用於展示了當前nginx的客戶端狀態資訊

在上述的laravel的nginx配置中的sever{}層中新增以下內容

location = /basic_status {
      stub_status;
}

通過配置的域名/basic_status訪問頁面,可檢視到以下內容
我也來總結一下nginx知識點

Active connections: 當前活動的客戶端連線數,包含Waiting 連線數。

accepts: 接受的客戶端連線總數

handled: 已處理的連線總數,通常該引數值與 accepts 應該是一致的,除非得到某個限制(worker_connections).

requests: 客戶端請求總數。

Reading: nginx 正在讀取請求標頭的當前連線數。

Writing: nginx 正在將響應寫回到客戶端的當前連線數。

Waiting: 當前等待請求的空閒客戶端連線數。

–with-http_sub_module

通過將一個指定的字串替換為另一個字串來修改響應
模組適用於:http,server,location

server{
    listen 80;
    server_name test.com;
    root /www/wwwroot/default;
    index index.php index.html index.htm default.php default.htm default.html;
    #把sub替換成SUB
    sub_filter 'sub' 'SUB'; 
    #只替換一次開關
    sub_filter_once off;
}

#/www/wwwroot/default/index.html內容如下
sub sds sub sub

我也來總結一下nginx知識點

fastcgi相關配置

FastCGI 是一種協議,規定了FastCGI應用和支援FastCGI的Web伺服器之間的介面。FastCGI是二進位制連續傳遞的。

我也來總結一下nginx知識點

以下為nginx轉發最基礎的php請求轉發配置

#匹配字尾為php的請求
location ~ \.php$ {
        #定義根目錄
        root           /usr/share/nginx/html;

        #將請求轉發給fastcgi管理程式處理
        fastcgi_pass   127.0.0.1:9000;

        #如果請求的URI是以 / 結束的, 該指令設定的檔案會被附加到URI的後面並儲存在變數$fastcig_script_name中
        fastcgi_index  index.php;

        #配置fastcgi引數
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
   }

fastcgi快取核心配置

fastcgi_cache_path:設定快取的路徑和其他引數。快取資料儲存在檔案中。快取中的鍵名和檔名都是將MD5功能應用於代理URL的結果
fastcai_cache_key : 定義用於快取的金鑰
fastcgi_cache : 定義用於快取的共享記憶體區域
fastcgi_cache_valid : 設定不同響應程式碼的快取時間

更多相關fastcgi相關引數可參看官方文件

常見功能

負載均衡配置

相關配置可檢視我寫的另一篇部落格簡單實踐搭建 nginx 負載均衡

動靜分離配置

參考部落格Nginx動靜分離基本概述

動靜分離,通過中間將動靜分離和靜態請求進行分離;
通過中介軟體將動態請求和靜態請求分離,可以建上不必要的請求消耗,同時能減少請求的延時。
通過中介軟體將動態請求和靜態請求分離,邏輯圖如下 :

我也來總結一下nginx知識點

動靜分離只有好處:動靜分離後,即使動態服務不可用,但靜態資源不會受到影響。

不過目前常見的做法是將圖片上傳到雲端儲存,可能比較少會在自己的nginx上配置相關引數,自己去儲存圖片視訊等靜態資源

簡單例子

location / {
    root /code/wordpress;
    index.php;
}
location ~* \.(png|jpg|mp4)${
     #指定圖片路徑
    root /code/wordpress/images;
    #壓縮
    gzip on;
    .....
}
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    .....
}

防盜鏈

參考nginx 防盜鏈配置

為了防止第三方引用連結訪問我們的圖片,消耗伺服器資源和網路流量,我們可以在伺服器上做防盜鏈限制。

實現防盜鏈的方式有兩種:refer方式和簽名方式。

refer方式

工作模組:ngx_http_referer_module

作用變數:$invalid_referer,全域性變數

配置域:server, location

server
{
    listen 80;
    server_name nginx.sonew.shop;
    root /www/wwwroot/test;
    index 1.html;
    default_type text/html;
    location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        valid_referers none blocked nginx.sonew.shop;
        if ($invalid_referer) {
            return 403;
        }
    }
}

valid_referers: 指定資源訪問是通過以下幾種方式為合法,即白名單。
none:允許缺失的頭部訪問。
blocked:允許referer沒有對應值的請求。
server_names:若referer站點域名與server_name中本機配的域名一樣允許訪問。

簽名方式

工作模組:第三方模組HttpAccessKeyModule。
需要安裝第三方模組,還沒動手實踐。。。

server {
    listen       80;
    server_name  www.imcati.com nginx.sonew.shop;
    root /usr/share/nginx/html;

    location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        accesskey on;
        accesskey_hashmethod md5;
        accesskey_arg "key";
        accesskey_signature "mypass$remote_addr";
    }
}
#accesskey on | off: 模組開關
#accesskey_hashmethod md5|sha—1: 簽名加密方式
#accesskey_arg: GET引數名稱
#accesskey_sign: 加密規則

//$sign = md5('mypass' . $_SERVICE['REMOTE_ADDR']);
//img src=/test.png?key=<?=$sign?>
本作品採用《CC 協議》,轉載必須註明作者和本文連結