最近在折騰服務器優化,從 Python 環境搭建到 Nginx 各種實用配置,踩了不少坑,也攢了些實戰經驗。整理成這篇博客,分享給需要的小夥伴,一起聊聊怎麼用 Nginx 搞定 Python 項目部署、灰度發佈、限流跨域這些事兒~
一、Python 網站項目部署:基礎環境打底
想跑 Python Web 項目,環境得先搭好。我這次直接用的經典組合 Python + WSGI :
- Python 安裝:根據項目需求選版本,我習慣用
yum或apt裝,簡單粗暴。要是追求版本靈活,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 走不同集羣 :
- 環境準備:先準備好 “舊版本集羣” 和 “新版本集羣”,可以是不同服務器,也能在同一台機器用不同端口區分。
- Nginx 配置:通過
split_clients或if ($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) 架構做灰度。我之前的操作流程:
- 環境部署:先裝 LNMP 環境(Nginx、MySQL、PHP 全套),確保動態請求能被 PHP-FPM 處理。
- 頁面修改:在新版本集羣裏調整 PHP 代碼、頁面樣式,模擬灰度內容。
- 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 檢查語法 ,重啓前先測試,別問我怎麼知道的(血淚教訓)!