@hayato0522 (hayato)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Django + nginx + gunicorn接続時の502 Bad Gatewayエラーについて

解決したいこと

AWSのubuntu環境上でdjango+nginx+gunicornにより作成したページに接続すると"502 Bad Gateway"が表示される。

詳細

django, nginx, gunicornでwebアプリを公開する練習を行っています。
AWSのubuntu環境でdjangoアプリが問題なく起動し繋がることは確認できましたが、その後nginxとgunicornを用いた接続を行った際,"502 Bad Gateway"の表示が現れ作成したページは表示されません。

下記ページを参考に作成を進め(ほぼqiita記事の通り)、qiita記事手順9のAWSにデプロイしwebページを表示するところまでは完了しております。

恐らく、nginxの設定ファイルに問題があると考えております。
見よう見まねで書いており、理解できていない部分も多いですが、django+nginx+gunicornの解説サイトは一通り目を通し、設定ファイルの記載方法に問題はないと思っており、単純にパスが悪いのかと考えております。
ただパスも間違っている箇所が見つからず数日作業が進んでいないため進んでいないため質問させていただきました。
(下記アドレスなど隠した方がよさそうな箇所は書き換えております。)

発生している問題・エラー

999.png

該当するソースコード

nginx設定ファイル(ファイル名:gmail)

server {

    listen 80;
    server_name <パブリックIPアドレス>;

    # ファビコンが見つからないというエラーを回避するおまじない
    location = /favicon.ico {access_log off; log_not_found off;}

    ### 以下、リクエストURLとNGINX上のパスとの対応を定義

    # Django静的ファイルへのパスを設定
    location /static/ {
        root /home/ubuntu/django-gmail-local/gmail;
    }

    # 管理者用ページのCSSを表示するためのパスを設定
    #location /static/admin {
    #    root /home/ubuntu/venv/lib/python3.6/site-packages/django/contrib/admin/static/admin;
    #}

    # リクエストをウェブページに流すためにunixソケットへのパスを設定
    location / {
        # 「/etc/nginx/proxy_params」にプロキシの設定が記載してある
        include proxy_params;
        # djangapp.sockにリクエスト結果を流している
        proxy_pass http://unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock;
    }
}

gunicorn設定ファイル(ファイル名:gunicorn.service)

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

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/django-gmail-local/gmail
ExecStart=/home/ubuntu/django/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock gmail.wsgi:application

[Install]
WantedBy=multi-user.target

gunicorn設定ファイルで参照しているgmail.socketファイル(ファイル名:gmail.socket)

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/home/ubuntu/django-gmail-local/gmail/gmail.sock

SocketUser=ubuntu

[Install]
WantedBy=sockets.target
階層

home/ubuntu/以下の階層
django:仮想環境名
django-gmail-loacl:djangoで作成したwebアプリを格納したリポジトリ
etc:nginx, gunicornの設定ファイルを記載するために作成したフォルダ

9999.png

自分で試したこと

nginxエラーログの確認

(django) ubuntu@ip-172-31-36-199:~$ sudo tail -f /var/log/nginx/error.log
2024/02/21 21:56:35 [crit] 100336#100336: *1 connect() to unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock failed (13: Permission denied) while connecting to upstream, client: <アドレス>, server: <アドレス>, request: "GET /form HTTP/1.1", upstream: "http://unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock:/form", host: <アドレス>

ファイルの存在確認と権限の確認
上記でアクセスできないgmail.sockは存在し、アクセスもできるはずである。

(django) ubuntu@ip-***-**-**-***:~$ ls -la /home/ubuntu/django-gmail-local/gmail/
total 476
drwxrwxr-x 4 ubuntu ubuntu     4096 Feb 21 22:01 .
drwxrwxr-x 4 ubuntu ubuntu     4096 Feb 15 10:25 ..
-rw-rw-r-- 1 ubuntu ubuntu      112 Feb 15 13:05 .env
-rw-rw-r-- 1 ubuntu ubuntu       11 Feb 15 10:25 .gitignore
-rw-rw-r-- 1 ubuntu ubuntu   458752 Feb 15 10:25 db.sqlite3
drwxrwxr-x 7 ubuntu ubuntu     4096 Feb 15 10:25 extract
drwxrwxr-x 3 ubuntu ubuntu     4096 Feb 20 13:15 gmail
srwxrwxrwx 1 ubuntu www-data      0 Feb 21 21:56 gmail.sock
-rw-rw-r-- 1 ubuntu ubuntu      661 Feb 15 10:25 manage.py

下記サイトで同様のエラーメッセージの場合の問題点がまとめられているが、”nginxがソケットにアクセスできない”が該当しエラーの発生に繋がっていると思われる。

(その他)gptに確認してと言われ確認したが問題なかった確認事項3点

(django) ubuntu@ip-***-**-**-***:~$ ps aux | grep gunicorn
root       51074  0.0  0.2  11900  2816 ?        S    Feb18   0:00 sudo systemctl status gunicorn.service
root       51075  0.0  0.1  11900  1624 ?        Ss   Feb18   0:00 sudo systemctl status gunicorn.service
root       51076  0.0  0.1  10860  1484 ?        T    Feb18   0:00 systemctl status gunicorn.service
ubuntu    100252  0.0  2.2  31124 21480 ?        Ss   21:56   0:00 /home/ubuntu/django/bin/python /home/ubuntu/django/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock gmail.wsgi:application
ubuntu    100254  0.0  3.9  50656 38404 ?        S    21:56   0:00 /home/ubuntu/django/bin/python /home/ubuntu/django/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock gmail.wsgi:application
ubuntu    100255  0.0  3.9  50656 38404 ?        S    21:56   0:00 /home/ubuntu/django/bin/python /home/ubuntu/django/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock gmail.wsgi:application
ubuntu    100256  0.0  3.9  50656 38404 ?        S    21:56   0:00 /home/ubuntu/django/bin/python /home/ubuntu/django/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock gmail.wsgi:application
ubuntu    100878  0.0  0.2   7008  2304 pts/2    S+   22:17   0:00 grep --color=auto gunicorn


(django) ubuntu@ip-***-**-**-***:~$ ls -la /etc/nginx/sites-enabled/
total 8
drwxr-xr-x 2 www-data www-data 4096 Feb 21 21:53 .
drwxr-xr-x 8 root     root     4096 Feb 18 13:04 ..
lrwxrwxrwx 1 root     root       44 Feb 21 21:53 gmail -> /home/ubuntu/etc/nginx/sites-available/gmail


(django) ubuntu@ip-***-**-**-***:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
0 likes

1Answer

proxy_pass http://unix:/home/ubuntu/django-gmail-local/gmail/gmail.sock;

http:// が余計ですね。

エラーはそれとは関係なさそうですが、
このロケーションだと gmail.sock 自体のアクセス権限はあるかもしれませんが、そこへ至るディレクトリのアクセス権限は大丈夫でしょうか?

nginx実行ユーザーでアクセスできることを確認すると良いと思います。

sudo --user www-data ls -l /home/ubuntu/django-gmail-local/gmail/gmail.sock;
1Like

Comments

  1. @hayato0522

    Questioner

    回答ありがとうございます!

    確かに該当ファイルに至るまでのディレクトリのアクセスについては確認しておりませんでした。

    帰宅後確認します!

  2. @hayato0522

    Questioner

    いろいろ触っていたため、原因がはっきりしないままではありますが、一旦表示できるようになりました。
    今回は/home/ubuntu/etcと/etcのパスを混同していた部分があり、nginx設定ファイルについて
    sudo ln -s
    でシンボリックを作るときに意図しないパスに作成してしまっていたことが原因かと思いました。

    教えていただいたディレクトリのアクセス権という視点はあまり考えたことなかったので参考になりました。
    ありがとうございます。

Your answer might help someone💌