Nginx

在具有不同子域(NGINX、Gunicorn、ubuntu)的同一個 Droplet 中託管兩個不同的 django 項目

  • February 16, 2022

正如標題所說,我想在具有不同子域的同一個 Droplet(NGINX、Gunicorn、ubuntu)中託管兩個不同的 django 項目。其中一個是我們的主站點 example.com。它已啟動並執行並完美執行。我們希望在同一個 Droplet 中託管臨時站點 staging.example.com。

我們已經為暫存站點創建了新的套接字和服務文件並啟動並啟用了它們,但問題是 nginx 仍然指向主域目錄中的文件而不是暫存目錄,因此即使已添加這些域,我們也會在下面收到此錯誤在暫存站點的 settings.py 允許的主機中

DisallowedHost at / 無效的 HTTP_HOST 標頭:“staging.example.com”。您可能需要將 >‘staging.example.com’ 添加到 ALLOWED_HOSTS

這是我們的 staging.guinicorn.service 文件

[Unit]
Description=staging.gunicorn daemon
Requires=staging.gunicorn.socket
After=network.target

[Service]
User=admin
Group=www-data
WorkingDirectory=/home/admin/example1staging
ExecStart=/home/admin/example1staging/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/staging.gunicorn.sock djangoproject.wsgi:application

[Install]
WantedBy=multi-user.target

這是我們的 staging.guicorn.socket 文件

[Unit]
Description=staging.gunicorn socket

[Socket]
ListenStream=/run/staging.gunicorn.sock

[Install]
WantedBy=sockets.target

最後是我們的 nginx 配置

server {
   listen 80;
   listen [::]:80;
   server_name example.com www.example.com;
   return 302 https://$server_name$request_uri;
}

server {
   # SSL configuration

   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   ssl_certificate         /etc/ssl/cert.pem;
   ssl_certificate_key     /etc/ssl/key.pem;
   ssl_client_certificate /etc/ssl/cloudflare.crt;
   ssl_verify_client on;

   root /var/www/html;
   index index.html index.htm index.nginx-debian.html;    

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home/admin/example1;
   }

   location / {
       include proxy_params;
       proxy_pass http://unix:/run/gunicorn.sock;
   }
}

server {
   listen 80;
   listen [::]:80;
   server_name staging.example.com www.staging.example.com;
   return 302 https://$server_name$request_uri;
}

server {
   # SSL configuration

   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   ssl_certificate         /etc/ssl/cert.pem;
   ssl_certificate_key     /etc/ssl/key.pem;
   ssl_client_certificate /etc/ssl/cloudflare.crt;
   ssl_verify_client on;

   root /var/www/html;
   index index.html index.htm index.nginx-debian.html;    

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home/admin/example1staging;
   }

   location / {
       include proxy_params;
       proxy_pass http://unix:/run/staging.gunicorn.sock;
   }
}

任何形式的幫助將不勝感激!

您的兩個 SSL 配置塊都缺少server_name指令。因此 nginx 對所有請求使用預設的虛擬主機,在這種情況下,它是第一個偵聽埠 443 的主機。

您需要添加適當的server_name指令來解決問題。

聽 443 ssl http2;

server_name example.com www.example.com;

聽 443 ssl http2;

server_name staging.example.com www.staging.example.com

請在 https 部分更改您的 nginx 文件

引用自:https://serverfault.com/questions/1093864