Nginx & Django & Gunicorn - サブドメインをアプリにリダイレクトする

Nginx & Django & Gunicorn - サブドメインをアプリにリダイレクトする

私はこのテーマについて徹底的に検索しましたが、何も助けにはなりませんでした。

現在、Django サイトを構築しており、Nginx を使用して Gunicorn にリバース プロキシしています。

アプリをサブドメインに分割しようとしています。(blog.example.com、admin.example.com、user.example.com など)

私の最初のプロジェクトでは Nginx のみを使用していたため、DNS レコードを適切に処理し、適切に機能しています。

「サブフォルダー」example.com/blog に移動すると、アプリにアクセスできます。

設定は次のようになります:

ソケット:



[Unit]
Description=Gunicorn socket for example.com

[Socket]
ListenStream=/run/example.sock

[Install]
WantedBy=sockets.target

/etc/systemd/system/gunicorn.service:

[Unit]
Description=gunicorn daemon for example.com
Requires=gunicorn.socket
After=network.target

[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          project.wsgi:application

[Install]
WantedBy=multi-user.target

/etc/nginx/sites-available/例:

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/example/project;
    }

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

blog.example.com に別の serverblock を追加し、proxy_pass 行に /blog を追加しました。proxy_pass http://unix:/run/gunicorn.sock/blog;アプリ フォルダーにリダイレクトされることを期待しています。

私はソケット方式を初めて使用しており、リダイレクトを実現する方法がわかりません。

Nginx がリダイレクトなどを処理する必要があることはわかっていますが、さらに進めればよいかわかりません。

どのような助けでも大歓迎です。

答え1

アプリごとに 1 つの gunicorn サービスを持つことができます。

/etc/systemd/system/blog.example.com.service

[Unit]
Description=gunicorn daemon for blog.example.com
Requires=gunicorn.socket
After=network.target

[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project/blog
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/blog.example.com.sock \
          project.wsgi:application

[Install]
WantedBy=multi-user.target

/etc/systemd/system/admin.example.com.service

[Unit]
Description=gunicorn daemon for admin.example.com
Requires=gunicorn.socket
After=network.target

[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project/admin
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/admin.example.com.sock \
          project.wsgi:application

[Install]
WantedBy=multi-user.target

次に、nginx をそれぞれのファイルにポイントします.sock

利用可能なサイト

server {
    listen 80;
    server_name blog.example.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/example/project;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/blog.example.com.sock;
    }
}

/etc/nginx/sites-available/admin.example.com

server {
    listen 80;
    server_name admin.example.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/example/project;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/admin.example.com.sock;
    }
}

答え2

使用すべきサービスファイルとソケットファイルを分離するあらゆるアプリや用途にUnixソケットの代わりに明示的なホスト

のような用語を、のunix:/run/blogような言葉に置き換えてください127.0.0.1:8000ソケットそしてサービスファイル。WorkingDirectoryパラメータはすべてのサービスファイルで同じで、含まれるディレクトリを指す必要がありますmanage.py。最後にproxy_pass http://127.0.0.1:8000/blog/;nginx設定。

ソケット

Unit]
Description=Gunicorn socket for blog.example.comg

[Socket]
ListenStream=8000

[Install]
WantedBy=sockets.target

/etc/systemd/system/blog.example.com.service

[Unit]
Description=gunicorn daemon for blog.example.com
Requires=blog.example.com.socket
After=network.target

[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project/blog
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind 127.0.0.1:8000 \
          project.wsgi:application

[Install]
WantedBy=multi-user.target

/etc/nginx/sites-available/blog-example:

server {
    listen 80;
    server_name blog.example.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/example/project;
    }

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:9000/blog/;
    }
} 

関連情報