三年前端還不會配置Nginx?刷完這篇就夠了

2024年2月6日 24点热度 0人点赞

一口氣看完,比自學強十倍!

什麼是Nginx

Nginx是一個開源的高性能HTTP和反向代理服務器。它可以用於處理靜態資源、負載均衡、反向代理和緩存等任務。Nginx被廣泛用於構建高可用性、高性能的Web應用程序和網站。它具有低內存消耗、高並發能力和良好的穩定性,因此在互聯網領域非常受歡迎。

為什麼使用Nginx

  1. 高性能:Nginx采用事件驅動的異步架構,能夠處理大量並發連接而不會消耗過多的系統資源。它的處理能力比傳統的Web服務器更高,在高並發負載下表現出色。
  2. 高可靠性:Nginx具有強大的容錯能力和穩定性,能夠在面對高流量和DDoS攻擊等異常情況下保持可靠運行。它能通過健康檢查和自動故障轉移來保證服務的可用性。
  3. 負載均衡:Nginx可以作為反向代理服務器,實現負載均衡,將請求均勻分發給多個後端服務器。這樣可以提高系統的整體性能和可用性。
  4. 靜態文件服務:Nginx對靜態資源(如HTML、CSS、JavaScript、圖片等)的處理非常高效。它可以直接緩存靜態文件,減輕後端服務器的負載。
  5. 擴展性:Nginx支持豐富的模塊化擴展,可以通過添加第三方模塊來提供額外的功能,如gzip壓縮、SSL/TLS加密、緩存控制等。

如何處理請求

Nginx處理請求的基本流程如下:

  1. 接收請求:Nginx作為服務器軟件監聽指定的端口,接收客戶端發來的請求。
  2. 解析請求:Nginx解析請求的內容,包括請求方法(GET、POST等)、URL、頭部信息等。
  3. 配置匹配:Nginx根據配置文件中的規則和匹配條件,決定如何處理該請求。配置文件定義了虛擬主機、反向代理、負載均衡、緩存等特定的處理方式。
  4. 處理請求:Nginx根據配置的處理方式,可能會進行以下操作:
  5. 靜態文件服務:如果請求的是靜態資源文件,如HTML、CSS、JavaScript、圖片等,Nginx可以直接返回文件內容,不必經過後端應用程序。
  6. 反向代理:如果配置了反向代理,Nginx將請求轉發給後端的應用服務器,然後將其響應返回給客戶端。這樣可以提供負載均衡、高可用性和緩存等功能。
  7. 緩存:如果啟用了緩存,Nginx可以緩存一些靜態或動態內容的響應,在後續相同的請求中直接返回緩存的響應,減少後端負載並提高響應速度。
  8. URL重寫:Nginx可以根據配置的規則對URL進行重寫,將請求從一個URL重定向到另一個URL或進行轉換。
  9. SSL/TLS加密:如果啟用了SSL/TLS,Nginx可以負責加密和解密HTTPS請求和響應。
  10. 訪問控制:Nginx可以根據配置的規則對請求進行訪問控制,例如限制IP訪問、進行身份認證等。
  11. 響應結果:Nginx根據處理結果生成響應報文,包括狀態碼、頭部信息和響應內容。然後將響應發送給客戶端。

什麼是正向代理和反向代理

正向代理

是指客戶端通過代理服務器發送請求到目標服務器。客戶端向代理服務器發送請求,代理服務器再將請求轉發給目標服務器,並將服務器的響應返回給客戶端。正向代理可以隱藏客戶端的真實IP地址,提供匿名訪問和訪問控制等功能。它常用於跨越防火墻訪問互聯網、訪問被封禁的網站等情況。

反向代理

是指客戶端發送請求到代理服務器,代理服務器再將請求轉發給後端的多個服務器中的一個或多個,並將後端服務器的響應返回給客戶端。客戶端並不直接訪問後端服務器,而是通過反向代理服務器來獲取服務。反向代理可以實現負載均衡、高可用性和安全性等功能。它常用於網站的高並發訪問、保護後端服務器、提供緩存和SSL終止等功能。

nginx 啟動和關閉

進入目錄:/usr/local/nginx/sbin
啟動命令:./nginx
重啟命令:nginx -s reload
快速關閉命令:./nginx -s stop
有序地停止,需要進程完成當前工作後再停止:./nginx -s quit
直接殺死nginx進程:killall nginx

目錄結構

[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp                 # POST 大文件暫存目錄
├── conf                             # Nginx所有配置文件的目錄
│   ├── fastcgi.conf                 # fastcgi相關參數的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始備份文件
│   ├── fastcgi_params               # fastcgi的參數文件
│   ├── fastcgi_params.default      
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒體類型
│   ├── mime.types.default
│   ├── nginx.conf                   #這是Nginx默認的主配置文件,日常使用和修改的文件
│   ├── nginx.conf.default
│   ├── scgi_params                 # scgi相關參數文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi相關參數文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi臨時數據目錄
├── html                             # Nginx默認站點目錄
│   ├── 50x.html                     # 錯誤頁面優雅替代顯示文件,例如出現502錯誤時會調用此頁面
│   └── index.html                   # 默認的首頁文件
├── logs                             # Nginx日志目錄
│   ├── access.log                   # 訪問日志文件
│   ├── error.log                   # 錯誤日志文件
│   └── nginx.pid                   # pid文件,Nginx進程啟動後,會把所有進程的ID號寫到此文件
├── proxy_temp                       # 臨時目錄
├── sbin                             # Nginx 可執行文件目錄
│   └── nginx                       # Nginx 二進制可執行程序
├── scgi_temp                       # 臨時目錄
└── uwsgi_temp                       # 臨時目錄

配置文件nginx.conf

# 啟動進程,通常設置成和cpu的數量相等
worker_processes  1;
# 全局錯誤日志定義類型,[debug | info | notice | warn | error | crit]
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
# 進程pid文件
pid        /var/run/nginx.pid;
# 工作模式及連接數上限
events {
    # 僅用於linux2.6以上內核,可以大大提高nginx的性能
    use   epoll;
    # 單個後臺worker process進程的最大並發鏈接數
    worker_connections  1024;
    # 客戶端請求頭部的緩沖區大小
    client_header_buffer_size 4k;
    # keepalive 超時時間
    keepalive_timeout 60;
    # 告訴nginx收到一個新連接通知後接受盡可能多的連接
    # multi_accept on;
}
# 設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
    # 文件擴展名與文件類型映射表義
    include       /etc/nginx/mime.types;
    # 默認文件類型
    default_type  application/octet-stream;
    # 默認編碼
    charset utf-8;
    # 服務器名字的hash表大小
    server_names_hash_bucket_size 128;
    # 客戶端請求頭部的緩沖區大小
    client_header_buffer_size 32k;
    # 客戶請求頭緩沖大小
    large_client_header_buffers 4 64k;
    # 設定通過nginx上傳文件的大小
    client_max_body_size 8m;
    # 開啟目錄列表訪問,合適下載服務器,默認關閉。
    autoindex on;
    # sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
    # 必須設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為 off,以平衡磁盤與網絡I/O處理速度
    sendfile        on;
    # 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
    #tcp_nopush     on;
    # 連接超時時間(單秒為秒)
    keepalive_timeout  65;
    # gzip模塊設置
    gzip on;               #開啟gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩沖區
    gzip_http_version 1.0#壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
    gzip_comp_level 2;     #壓縮等級
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    # 開啟限制IP連接數的時候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    # 指定虛擬主機的配置文件,方便管理
    include /etc/nginx/conf.d/*.conf;
    # 負載均衡配置
    upstream aaa {
        # 請見上文中的五種配置
    }
   # 虛擬主機的配置
    server {
        # 監聽端口
        listen 80;
        # 域名可以有多個,用空格隔開
        server_name www.aaa.com aaa.com;
        # 默認入口文件名稱
        index index.html index.htm index.php;
        root /data/www/sk;
        # 圖片緩存時間設置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${
            expires 10d;
        }
        #JS和CSS緩存時間設置
        location ~ .*.(js|css)?${
            expires 1h;
        }
        # 日志格式設定
        #$remote_addr與 $http_x_forwarded_for用以記錄客戶端的ip地址;
        #$remote_user:用來記錄客戶端用戶名稱;
        #$time_local:用來記錄訪問時間與時區;
        #$request:用來記錄請求的url與http協議;
        #$status:用來記錄請求狀態;成功是200,
        #$body_bytes_sent :記錄發送給客戶端文件主體內容大小;
        #$http_referer:用來記錄從那個頁面鏈接訪問過來的;
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent$http_x_forwarded_for';
        # 定義本虛擬主機的訪問日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
        # 對具體路由進行反向代理
        location /connect-controller {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            # 後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            # 允許客戶端請求的最大單文件字節數
            client_max_body_size 10m;
            # 緩沖區代理緩沖用戶端請求的最大字節數,
            client_body_buffer_size 128k;
            # 表示使nginx阻止HTTP應答代碼為400或者更高的應答。
            proxy_intercept_errors on;
            # nginx跟後端服務器連接超時時間(代理連接超時)
            proxy_connect_timeout 90;
            # 後端服務器數據回傳時間_就是在規定時間之內後端服務器必須傳完所有的數據
            proxy_send_timeout 90;
            # 連接成功後,後端服務器響應的超時時間
            proxy_read_timeout 90;
            # 設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
            proxy_buffer_size 4k;
            # 設置用於讀取應答的緩沖區數目和大小,默認情況也為分頁大小,根據操作系統的不同可能是4k或者8k
            proxy_buffers 4 32k;
            # 高負荷下緩沖大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;
            # 設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長
            # 設定緩存文件夾大小,大於這個值,將從upstream服務器傳
            proxy_temp_file_write_size 64k;
        }
        # 動靜分離反向代理配置(多路由指向不同的服務端或界面)
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

location

location指令的作用就是根據用戶請求的URI來執行不同的應用

語法

location [ = | ~ | ~* | ^~ ] uri {...}
location [ = | ~ | ~* | ^~ ] uri {...}
  • [ = | ~ | ~* | ^~ ]:匹配的標識
    • ~與~*的區別是:~區分大小寫,~*不區分大小寫
    • ^~:進行常規字符串匹配後,不做正則表達式的檢查
  • uri:匹配的網站地址
  • {...}:匹配uri後要執行的配置段

舉例

location = / {
    [ configuration A ]
}
location / {
    [ configuration B ]
}
location /sk/ {
    [ configuration C ]
}
location ^~ /img/ {
    [ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  • = / 請求 / 精準匹配A,不再往下查找
  • / 請求/index.html匹配B。首先查找匹配的前綴字符,找到最長匹配是配置B,接著又按照順序查找匹配的正則。結果沒有找到,因此使用先前標記的最長匹配,即配置B。
  • /sk/ 請求/sk/abc 匹配C。首先找到最長匹配C,由於後面沒有匹配的正則,所以使用最長匹配C。
  • ~* .(gif|jpg|jpeg)$ 請求/sk/logo.gif 匹配E。首先進行前綴字符的查找,找到最長匹配項C,繼續進行正則查找,找到匹配項E。因此使用E。
  • ^~ 請求/img/logo.gif匹配D。首先進行前綴字符查找,找到最長匹配D。但是它使用了^~修飾符,不再進行下面的正則的匹配查找,因此使用D。

單頁面應用刷新404問題

    location / {
        try_files $uri $uri/ /index.html;
    }

配置跨域請求

server {
    listen   80;
    location / {
        # 服務器默認是不被允許跨域的。
        # 配置`*`後,表示服務器可以接受所有的請求源(Origin),即接受所有跨域的請求
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        # 發送"預檢請求"時,需要用到方法 OPTIONS ,所以服務器需要允許該方法
        # 給OPTIONS 添加 204的返回,是為了處理在發送POST請求時Nginx依然拒絕訪問的錯誤
        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }
}

開啟gzip壓縮

    # gzip模塊設置
    gzip on;               #開啟gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩沖區
    gzip_http_version 1.0#壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
    gzip_comp_level 2;     #壓縮等級
    # 設置什麼類型的文件需要壓縮
    gzip_types text/plain application/x-javascript text/css application/xml;
    # 用於設置使用Gzip進行壓縮發送是否攜帶“Vary:Accept-Encoding”頭域的響應頭部
    # 主要是告訴接收方,所發送的數據經過了Gzip壓縮處理
    gzip_vary on;

總體而言,Nginx是一款輕量級、高性能、可靠性強且擴展性好的服務器軟件,適用於搭建高可用性、高性能的Web應用程序和網站。

原文鏈接:
https://juejin.cn/post/7270153705877241890