Nginx 多 Python 项目虚拟主机需每个项目独占 server 块、独立 uWSGI 实例及隔离环境;uWSGI 配置指定唯一 socket 和虚拟环境;Nginx 通过 server_name 和 uwsgi_pass 严格路由;代码、日志、权限彻底分离;默认 server 返回 444 防暴露。
在 Nginx 中为多个 Python 项目配置独立虚拟主机,核心是“每个项目独占一个 server 块 + 独立 uWSGI(或 Gunicorn)进程 + 隔离的运行环境”。不能像纯静态 HTML 那样只靠 root 和 server_name 切分,必须让后端应用服务与 Nginx 协同工作。
避免端口冲突和进程干扰,不共用一个 uWSGI 进程组:
/etc/uwsgi/apps-available/project1.ini 和 /etc/uwsgi/apps-available/project2.ini
/run/uwsgi-project1.sock)或监听端口(如 :8001),并绑定到对应项目的虚拟环境sudo ln -s /etc/uwsgi/apps-available/project1.ini /etc/uwsgi/apps-enabled/
chmod 664 /run/uwsgi-project1.sock)每个 Python 项目对应一个独立的 server 块,关键字段不可复用:
server_name 必须唯一且匹配实际访问域名(如 api.example.com、admin.example.net)location / 内使用 uwsgi_pass 指向该项目专属的 uWSGI socket 或地址端口(例如:uwsgi_pass unix:/run/uwsgi-project1.sock;)
include uwsgi_params;,并可追加项目级参数:uwsgi_param UWSGI_CHDIR /var/www/project1;
uwsgi_param UWSGI_MODULE wsgi:application;
access_log /var/log/nginx/project1_access.log;
防止依赖冲突和权限越界,从源头隔离:
python3 -m venv /opt/venvs/project1
/opt/venvs/project1/bin/pip install -r /var/www/project1/requirements.txt
/var/www/api.example.com/、/var/www/admin.example.net/
virtualenv = /opt/venvs/project1 显式指定环境路径www-data(Ubuntu/Debian)或 nginx(CentOS/RHEL),例如:sudo chown -R deploy:www-data /var/www/api.example.com
未命中任何 server_name 的请求,不能落入某个 Python 项目中暴露敏感信息:
/etc/nginx/conf.d/00-default.conf(数字前缀确保优先加载)server { listen 80 default_server; return 444; }
(444 表示关闭连接,比 404 更安全)
return 404 "Site not configured"; 或指向静态 HTML