在单个 Nginx 服务器上托管多个网站
在一台服务器上运行多个网站是 Web 开发人员和系统管理员的常见要求。本指南将引导您完成配置 Nginx 的过程,以便使用单独的域为多个网站提供服务,每个网站都使用 Gunicorn 运行自己的 Python/Django 应用程序。
在本文中,我假设您知道如何部署和设置用户和权限。
目录结构
您的项目应该组织在一个干净的目录结构中:
/home/username/ ├── FirstProject/ │ ├── manage.py │ └── ... (other Django files) ├── SecondProject/ │ ├── manage.py │ └── ... (other Django files) └── venv/
步骤1:配置Nginx虚拟主机
Nginx 使用服务器块(虚拟主机)来处理多个域。为每个网站创建单独的配置文件:
创建第一个网站的配置:
server { listen 80; server_name your-first-domain.com; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/username/FirstProject; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }
创建第二个网站的配置:
server { listen 80; server_name your-second-domain.com; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/username/SecondProject; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn-second.sock; } }
第 2 步:设置 Gunicorn 服务
每个网站都需要自己的 Gunicorn 服务和套接字。设置方法如下:
创建第一个 Gunicorn 服务文件(/etc/systemd/system/gunicorn.service):
[Unit] Description=gunicorn daemon for first site Requires=gunicorn.socket After=network.target [Service] User=username Group=www-data WorkingDirectory=/home/username/FirstProject ExecStart=/home/username/venv/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ FirstProject.wsgi:application [Install] WantedBy=multi-user.target
创建第二个 Gunicorn 服务文件(/etc/systemd/system/gunicorn-second.service):
[Unit] Description=gunicorn daemon for second site Requires=gunicorn-second.socket After=network.target [Service] User=username Group=www-data WorkingDirectory=/home/username/SecondProject ExecStart=/home/username/venv/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn-second.sock \ SecondProject.wsgi:application [Install] WantedBy=multi-user.target
为两个服务创建套接字文件:
第一个套接字(/etc/systemd/system/gunicorn.socket):
Description=gunicorn socket for first site [Socket] ListenStream=/run/gunicorn.sock User=www-data [Install] WantedBy=sockets.target
第二个套接字(/etc/systemd/system/gunicorn-second.socket):
[Unit] Description=gunicorn socket for second site [Socket] ListenStream=/run/gunicorn-second.sock User=www-data [Install] WantedBy=sockets.target
步骤 3:启动并启用服务
重新加载 systemd 以识别新服务:
`sudo systemctl daemon-reload`
启动并启用两个套接字:
`sudo systemctl 启动 gunicorn.socket gunicorn-second.socket
sudo systemctl 启用 gunicorn.socket gunicorn-second.socket`
启动并启用两个服务:
`sudo systemctl 启动 gunicorn gunicorn-second
sudo systemctl 启用 gunicorn gunicorn-second`
测试 Nginx 配置:
`sudo nginx -t`
重新加载并检查服务状态
sudo systemctl reload nginx sudo systemctl status gunicorn sudo systemctl status gunicorn-second
和瓦拉