最近在折騰服務器優化,從 Python 環境搭建到 Nginx 各種實用配置,踩了不少坑,也攢了些實戰經驗。整理成這篇博客,分享給需要的小夥伴,一起聊聊怎麼用 Nginx 搞定 Python 項目部署、灰度發佈、限流跨域這些事兒~

一、Python 網站項目部署:基礎環境打底

想跑 Python Web 項目,環境得先搭好。我這次直接用的經典組合 Python + WSGI

  • Python 安裝:根據項目需求選版本,我習慣用 yumapt 裝,簡單粗暴。要是追求版本靈活,pyenv 也不錯,多版本切換無壓力。
  • WSGI 配置:這是 Python Web 項目和服務器的 “橋樑”。
  • 安裝wsgi:
pip3 install uWSGI-2.0.21.tar.gz  #沒有壓縮包的可以從網上查找資源

創建配置文件(默認不存在需手動編寫),然後啓動動態網站:
vim myproject.ini

[uwsgi]

socket=127.0.0.1:8000                   #與web服務(nginx)通信的接口

chdir=/root/python/python-project-demo   #網站的工作目錄

wsgi-file=learning_log/wsgi.py          #定義網站運行時,uwsgi調用的腳本文件

daemonize=/var/log/uwsgi.log            #指定日誌文件位置
  • 啓動uWSGI服務
[root@proxy python]# uwsgi --ini myproject.ini  # 加載myproject.ini配置文件啓動uWSGI服務
[uWSGI] getting INI configuration from myproject.ini

[root@proxy python]# ss -antlp | grep 8000  # 驗證8000端口已正常監聽,服務啓動成功
  • 配置Nginx反向代理
[root@proxy python]# vim /usr/local/nginx/conf/nginx.conf

在配置文件中添加以下內容:

location / {
    uwsgi_pass 127.0.0.1:8000;    # 將動態請求轉發至uWSGI服務
    include uwsgi_params;         # 加載uWSGI參數配置
    root html;
    index index.html index.htm;
}

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    expires 30d;
}

重啓Nginx服務:

[root@proxy python]# /usr/local/nginx/sbin/nginx
  • 服務測試
  • 通過瀏覽器訪問:http://192.168.99.5   #根據自己的ip地址進行測試

二、Nginx 灰度發佈:精準控制版本流量

灰度發佈(金絲雀發佈)能讓新功能 “小範圍試用、再全量上線”,用 Nginx 實現超簡單!核心思路是 不同用户 /IP 走不同集羣

  1. 環境準備:先準備好 “舊版本集羣” 和 “新版本集羣”,可以是不同服務器,也能在同一台機器用不同端口區分。
  2. Nginx 配置:通過 split_clientsif ($remote_addr) 匹配規則,把特定用户 / IP 導到新版本,其他走舊版。比如想讓 192.168.1.100 這個 IP 訪問新版本:

nginx

http {
    # 定義兩個 upstream,分別對應新舊版本
    upstream old_cluster {
        server 192.168.1.1:8080;
    }
    upstream new_cluster {
        server 192.168.1.2:8080;
    }

    server {
        listen 80;
        server_name your_domain.com;

        # 根據 IP 匹配灰度規則
        if ($remote_addr = "192.168.1.100") {
            proxy_pass http://new_cluster;
        }
        proxy_pass http://old_cluster;
    }
}

這樣就能精準控制流量,驗證新功能時更安全,發現問題也能快速回退~

三、Nginx + LNMP 灰度測試:動態靜態分工明確

如果項目是動態 + 靜態混合(比如 PHP 動態頁面 + 圖片 / CSS 靜態資源),可以用 LNMP(Linux + Nginx + MySQL + PHP) 架構做灰度。我之前的操作流程:

  1. 環境部署:先裝 LNMP 環境(Nginx、MySQL、PHP 全套),確保動態請求能被 PHP-FPM 處理。
  2. 頁面修改:在新版本集羣裏調整 PHP 代碼、頁面樣式,模擬灰度內容。
  3. Nginx 路由:用 location 正則匹配,靜態資源(如 .js、.css、.jpg)走 Nginx 直接返回,動態請求(.php)轉發給 PHP-FPM 處理。配置示例:

nginx

server {
    listen 80;
    server_name your_domain.com;

    # 靜態資源直接處理
    location ~* \.(js|css|jpg|png)$ {
        root /path/to/static/files;
        expires 30d; # 緩存優化
    }

    # 動態請求轉發給 PHP-FPM
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

動態靜態分離後,訪問速度更快,灰度測試也能更清晰區分動態邏輯和靜態資源的表現~

四、Nginx 限流:給服務器 “踩剎車”

高併發時,服務器扛不住?用 Nginx 限流給請求 “排隊”!核心是 limit_req 模塊,按 請求頻率連接數 限制。比如限制單個 IP 每秒最多 10 個請求:

nginx

http {
    # 定義限流規則:10r/s
    limit_req_zone $remote_addr zone=mylimit:10m rate=10r/s;

    server {
        listen 80;
        server_name your_domain.com;

        location / {
            # 應用限流規則
            limit_req zone=mylimit;
            proxy_pass http://your_upstream;
        }
    }
}

還能結合 limit_conn 限制併發連接數,雙管齊下,防止流量洪峯把服務器打垮~

五、Nginx 跨域:解決前端 “跨域報錯” 難題

前後端分離項目,跨域問題逃不掉!Nginx 配置 add_header 就能輕鬆解決:

nginx

server {
    listen 80;
    server_name your_domain.com;

    location / {
        # 允許所有源(生產環境建議限定具體域名)
        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'; 

        if ($request_method = 'OPTIONS') {
            return 204; # 處理 OPTIONS 預檢請求
        }

        proxy_pass http://your_backend;
    }
}

這樣前端調用接口就不會被瀏覽器攔截,跨域報錯直接 “消失”~

總結:Nginx 是真・萬能小助手!

從 Python 項目部署,到灰度發佈、限流、跨域,Nginx 幾乎承包了 Web 服務器的各種需求。這些配置我都在實際項目裏驗證過,踩過的坑整理成經驗,希望能幫大家少走彎路~

最後嘮叨一句:配置完一定要用 nginx -t 檢查語法 ,重啓前先測試,別問我怎麼知道的(血淚教訓)!