在单个 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

和瓦拉