【その9】nginxの設定【初めてのAWSデプロイ編】
投稿者: urumos
作成日: 2022年5月29日16:56
更新日: 2022年5月29日22:22
カテゴリ: 初めてのAWSデプロイ
タグ:
Nginxの設定ファイルを作る。
sudo vi /etc/nginx/sites-available/DjangoMyBlog
中身は下記
server {
listen 80;
server_name XXX.com
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/XXX/pyprojects/DjangoMyBlog;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket;
}
}
sites-enabledにシンボリックリンクを作り、この設定を反映させる。
sudo ln -s /etc/nginx/sites-available/DjangoMyBlog /etc/nginx/sites-enabled/
※-sオプション=シンボリックリンク化。lnコマンドをするときは大概これ。
デフォルト設定のシンボリックリンクは除外して、設定を再読込、nginxを再起動させる。
再起動
sudo systemctl restart nginx
ここで下記のエラーが出た。
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
restartをreloadに変えてもだめだった。
調べたところ、下記のコマンドで設定ファイルの検証ができるらしい。
sudo nginx -t
やってみると下記が出た
nginx: [emerg] directive "server_name" is not terminated by ";" in /etc/nginx/sites-enabled/DjangoMyBlog:5
nginx: configuration file /etc/nginx/nginx.conf test failed
サーバーネームの部分が「;」で終わってないよとのこと。
/etc/nginx/sites-available/DjangoMyBlogを見返したらXXX.comの最後に;をつけ忘れていた!
追記し、再度検証
sudo nginx -t
すると
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
できたっぽい!
再起動
sudo systemctl restart nginx
ステータス確認
sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-03-24 15:18:14 JST; 6s ago
Docs: man:nginx(8)
Process: 431980 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 431981 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 431982 (nginx)
Tasks: 2 (limit: 1147)
Memory: 2.4M
CGroup: /system.slice/nginx.service
tq431982 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
mq431983 nginx: worker process
Mar 24 15:18:14 ip-10-0-1-10 systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 24 15:18:14 ip-10-0-1-10 systemd[1]: Started A high performance web server and a reverse proxy server.
activeになった!
これでブラウザでXXX.comでアクセスできるか確認してみる。
出来ない。
マイグレーションしてみる
python3.9 manage.py migrate
マイグレーション自体は成功したっぽいが、サイトにはアクセスできない。
collectstaticしてみる
python3.9 manage.py collectstatic
You have requested to collect static files at the destination
location as specified in your settings.
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel:
なんか脅されてるし、怖いから一旦"no"
runserverしてみる
python3.9 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
March 24, 2022 - 15:30:57
Django version 3.1.5, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Error: That port is already in use.
既に8000番ポートで開いていると。
Gunicornを停止してみる
sudo pkill gunicorn
再起動
sudo systemctl restart gunicorn
再度runserver
できたけど今度はXXX.comだけでなくXXX.com:8000も開けない。なぜや。
ファイヤーウォールに80番を追加してみる。
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo ufw allow 'Nginx Full'
[sudo] password for XXX:
Rules updated
Rules updated (v6)
サイトは開けない。
困った。。
今までで飛ばしている工程がないかチェックするがよくわからない。
エラーログチェック
sudo cat /var/log/nginx/error.log
2022/03/26 00:32:02 [crit] 431983#431983: *385 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 52.39.76.92, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 00:35:46 [crit] 431983#431983: *390 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 54.189.207.101, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 00:43:52 [crit] 431983#431983: *392 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 54.202.189.63, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 00:44:24 [crit] 431983#431983: *394 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 54.68.94.169, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 04:38:53 [crit] 431983#431983: *415 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET /robots.txt HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/robots.txt", host: "XXX.com"
(END)
どうやら権限がないのが問題みたい。
改めて現在のそれぞれの設定ファイルを確認する
★Gunicornの設定ファイル
XXX@ip-10-0-1-10:~$ cat /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=XXX
Group=www-data
WorkingDirectory=/home/XXX/pyprojects/DjangoMyBlog
ExecStart=/home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
[Install]
WantedBy=multi-user.target
★Nginxの設定ファイル
XXX@ip-10-0-1-10:~$ sudo cat /etc/nginx/sites-available/DjangoMyBlog
server {
listen 80;
server_name XXX.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/XXX/pyprojects/DjangoMyBlog;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock;
}
}
★Nginxの設定ファイル(大元)
XXX@ip-10-0-1-10:~$ sudo cat /etc/nginx/nginx.conf
[sudo] password for XXX:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
XXX@ip-10-0-1-10:~$
解決方法をとにかくググる
・www-dataの部分をXXXに変更?
・ユーザーXXXをwww-dataグループに追加?
・設定をnginx.confに直書きする?
・proxy_passのところをhttp://127.0.0.1:8000;に変更する?⇒これはソケットではなくhttp接続の場合なので却下
・gunicorn.socketという設定ファイルを作成する?
そもそものNginxの設定ファイルの基本的な書き方についてググる
関係図は下記
クライアント⇔Nginx⇔Gunicorn⇔Django
Nginxの実行を行なっているユーザーは誰か?
⇒www-dataユーザー
www-dataユーザーとは?
www-dataは、Ubuntu上のWebサーバー(Apache、nginxなど)がデフォルトで通常の操作に使用するユーザー
あくまでデフォルトであり、セキュリティ的観点からwww-dataではなく他のユーザーを作って割り当ててたりもする模様
NginxとGunicornの接続方法には「①ソケット接続」と「②HTTP接続」の2つがあるが、
自分が参考にした記事はそれぞれどっちか?
「Snow Tree in June」によると、http接続の場合はgunicornの設定ファイルは作成せず、単にバックグラウンドでバインドするのみだった。
よって設定ファイルを作っている記事は全てソケット接続なのだろう。
1つ目の記事(自動化なしに生活なし。2021年7月)
ソケット接続
2つ目の記事(トマト好きの方。2021年8月)
設定ファイルを作ってないし、nginx設定ファイルの書き方が「Snow Tree in June」と似ているので恐らくHTTP接続。
3つ目の記事(Qiitaポコツンさん。2019年9月)
同じく設定ファイルを作ってないし、nginx設定ファイルの書き方が「Snow Tree in June」と似ているので恐らくHTTP接続。
4つ目の記事(Qiitaバシさん。【丁寧解説】。2021年12月)
ソケット接続
半々だ。4つをごちゃまぜに参考にしたからエラーになっているのかも。
トマトさんのもう1つの記事(今度はAmazonLinuxではなくUbuntuなのでより自分の環境に近い。ただしサーバーはAWSではなくさくらVPS)では、Gunicornの設定ファイルを書いていた。
この観点をもって再度5つの記事を見直してみよう。
よくわからないーーー。
もうヤケや!色々やったる。
www-dataグループにXXXを追加
sudo usermod -G www-data XXX
サイトを開く
ダメ
www-dataの部分をXXXに変更(sudo vim /etc/nginx/nginx.conf)
nginx -tで検証すると下記のエラーがおきた
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2022/04/14 12:18:46 [warn] 602250#602250: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2022/04/14 12:18:46 [emerg] 602250#602250: open() "/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
一旦戻す
念のため再度nginx -t
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ nginx -t
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2022/04/14 12:19:41 [warn] 602256#602256: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2022/04/14 12:19:41 [emerg] 602256#602256: open() "/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
ありゃりゃ同じエラーやんけ。なぜや。
もう疲れてきたぞ、、
エラーをちゃんと見る
「エラーログファイルを開けません。(権限エラー)
userの指定はマスタープロセスがスーパーユーザー権限で実行された場合のみOKです。/etc/nginx/nginx.confの1行目で無視された。
/etc/nginx/nginx.confの構文はOK。
/run/nginx.pidは失敗(権限エラー)
/etc/nginx/nginx.confのテストは失敗」
全体的に権限エラーっぽい。
「/etc/nginx/nginx.confの1行目」とあるが、そこがuser=www-dataになっている。
あれ、もしかしたらそこに「;」が抜けてるかも?
と思いsudoで確認しようとしたところ、XXXにsudo権限がないとのこと。
補助グループをwww-dataに変えたからか。グループって2つまでしか入れないんか。
久々にubuntuに切り替え、再度XXXの補助グループをsudoに変更(ubuntu消さなくてよかったー笑)
sudo usermod -G sudo XXX
無事sudoグループに変更できた。
早速XXXに切り替えて確認してみる。
しかし「;」はついていた。
ふと思い出して、sudoつきで、nginx -tをしてみる
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
できた!
そういえばnginx -tコマンドはsudoつけなきゃだったじゃんね、、うっかり。
さて、本題に戻る。
なぜサイトが開けないのか。
最後に開けた段階まで戻ってみよう。
念のため再度gunicornコマンドを打ってみる
gunicorn --bind 0.0.0.0:8000 config.wsgi
すると
command gunicorn not foundと出た。
仮想環境に移動し、再実行。同じ。
pip listをすると確かにインストールされているのでおかしい。
以前パスの問題があったから、同じかなと思いパスを確認
echo $PATH | sed -e 's/:/\n/g'
すると消えてた。
なぜ?一度ubuntuでログインしてから切り替えたからかな?
ログインシェルはログイン時に読み込まれるからそれかも。
一度TeraTermを閉じ、再度XXXでログインする。
再度仮想環境に移動し、gunicornコマンドを打つと、無事実行できた。
サイトを見てみる。
するとなぜか開けた!!
あれ、てかそもそもなんで開けない状態になったんだっけ?
そしてこれはNginxを使って見れている状態なのか?
状況を再度整理する。
そうだ。問題はXXX.com:8000ではアクセスできるけど、XXX.comでアクセスできないことだ。
状況としてはgunicornコマンドを実行すれば8000でアクセスはできる。
しかし、XXX.comにアクセスすると「502 Bad Gateway」エラーになる。
これを表示させたい。
再度エラーログをよく見てみる
sudo cat /var/log/nginx/error.log
。。。
2022/04/15 13:06:44 [crit] 591504#591504: *522 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 35.201.0.148, server: XXX.com, request: "GET /sito/wp-includes/wlwmanifest.xml HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/sito/wp-includes/wlwmanifest.xml", host: "XXX.com"
2022/04/15 14:38:16 [crit] 591504#591504: *553 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 92.118.36.208, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
2022/04/15 16:26:05 [crit] 612240#612240: *1 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
日本語訳
unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock への接続に失敗しました。(権限エラー)
Nginxの実行ユーザはwww-dataさん。
この人に、/home/XXX/pyprojects/DjangoMyBlog/config.sockへの権限がないってことかな。
再度、www-dataの部分をXXXに変更してみる
sudo vim /etc/nginx/nginx.conf
今度はちゃんとsudoつきで検証してみる
sudo nginx -t
すると成功!
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
一応再起動
sudo systemctl restart nginx
サイト(XXX.com)を開いてみる
同じく「502 Bad Gateway」エラー。
再度エラーログを見てみる。
2022/04/15 16:44:50 [crit] 612240#612240: *4 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
2022/04/15 17:04:13 [crit] 612464#612464: *1 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (2: No such file or directory) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
2022/04/15 17:04:14 [crit] 612464#612464: *1 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (2: No such file or directory) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
お!エラーが変わった!
日本語訳
unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock への接続に失敗しました。(そんなファイルはありません)
そんなファイルはない??
確かにそのディレクトリにいくとconfig.sockというファイルはない。
再度このエラー文でぐぐる。
・sockファイルを作らなきゃいけない?
・gunicornのの設定ファイルをきちんと書けばsockファイルは自動で生成されるのでマニュアルで作成不要?
色々な情報があったが、
下記サイト
https://www.datadoghq.com/blog/nginx-502-bad-gateway-errors-gunicorn/
で、原因は
・Gunicornが動いていない
・NginxがGunicornとコミュニケーションできない
・Gunicornがタイムアウトしている
と書いてあった。
この記事を見ている中で、自分のgunicornが8000番ポートで動かしていることを思い出した。
考えてみたら8000番で動いてたら80番で動けないんじゃ、、、?
プロセスを確認する。
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ ps aux | grep gunicorn
XXX 612200 0.0 1.9 29644 19396 ? S 16:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612250 0.0 4.2 60372 42456 ? S 16:26 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612548 0.0 0.0 8168 720 pts/0 S+ 17:17 0:00 grep --color=auto gunicorn
プロセスを止める
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo pkill gunicorn
再度プロセスを確認
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ ps aux | grep gunicorn
XXX 612559 0.0 0.0 8168 716 pts/0 S+ 17:19 0:00 grep --color=auto gunicorn
再度デーモンで8000番で実行
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ gunicorn --bind 0.0.0.0:8000 config.wsgi -D
Gunicornを再起動
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo systemctl restart gunicorn
再度プロセスを確認
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ ps aux | grep gunicorn
XXX 612577 0.0 1.9 29644 19336 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612578 0.2 4.7 62504 46936 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612594 2.6 2.3 29660 22936 ? Ss 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612595 4.1 4.2 60376 42308 ? S 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612596 4.1 4.2 60376 42308 ? S 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612597 4.1 4.2 60376 42312 ? S 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612599 0.0 0.0 8168 652 pts/0 S+ 17:23 0:00 grep --color=auto gunicorn
最後が切れててわからないけど、デーモンモードONで再起動したから、
そのままデーモンモードで再開したと思われる
ステータス確認
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-15 17:23:19 JST; 1min 32s ago
Main PID: 612594 (gunicorn)
Tasks: 4 (limit: 1147)
Memory: 92.5M
CGroup: /system.slice/gunicorn.service
tq612594 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
tq612595 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
tq612596 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
mq612597 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
Apr 15 17:23:19 ip-10-0-1-10 systemd[1]: Started gunicorn daemon.
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:23:19 +0900] [612594] [INFO] Starting gunicorn 20.1.0
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:23:19 +0900] [612594] [INFO] Listening at: unix:/home/XXX/pyprojects/D>
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:23:19 +0900] [612594] [INFO] Using worker: sync
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612595]: [2022-04-15 17:23:19 +0900] [612595] [INFO] Booting worker with pid: 612595
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612596]: [2022-04-15 17:23:19 +0900] [612596] [INFO] Booting worker with pid: 612596
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612597]: [2022-04-15 17:23:19 +0900] [612597] [INFO] Booting worker with pid: 612597
lines 1-19/19 (END)
今度はデーモンモードを止めてから再起動してみる
プロセスをとめる
sudo pkill gunicorn
ステータス確認
sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Fri 2022-04-15 17:26:46 JST; 2s ago
Process: 612594 ExecStart=/home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoM>
Main PID: 612594 (code=exited, status=0/SUCCESS)
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612597]: [2022-04-15 17:23:19 +0900] [612597] [INFO] Booting worker with pid: 612597
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [INFO] Handling signal: term
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612595]: [2022-04-15 17:26:46 +0900] [612595] [INFO] Worker exiting (pid: 612595)
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612596]: [2022-04-15 17:26:46 +0900] [612596] [INFO] Worker exiting (pid: 612596)
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612597]: [2022-04-15 17:26:46 +0900] [612597] [INFO] Worker exiting (pid: 612597)
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [WARNING] Worker with pid 612595 was terminated due to si>
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [WARNING] Worker with pid 612597 was terminated due to si>
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [WARNING] Worker with pid 612596 was terminated due to si>
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [INFO] Shutting down: Master
Apr 15 17:26:46 ip-10-0-1-10 systemd[1]: gunicorn.service: Succeeded.
再起動する
sudo systemctl restart gunicorn
ステータス確認
sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-15 17:27:42 JST; 5s ago
Main PID: 612635 (gunicorn)
Tasks: 4 (limit: 1147)
Memory: 93.1M
CGroup: /system.slice/gunicorn.service
tq612635 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
tq612636 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
tq612637 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
mq612638 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
Apr 15 17:27:42 ip-10-0-1-10 systemd[1]: Started gunicorn daemon.
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612635]: [2022-04-15 17:27:42 +0900] [612635] [INFO] Starting gunicorn 20.1.0
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612635]: [2022-04-15 17:27:42 +0900] [612635] [INFO] Listening at: unix:/home/XXX/pyprojects/Djang>
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612635]: [2022-04-15 17:27:42 +0900] [612635] [INFO] Using worker: sync
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612636]: [2022-04-15 17:27:42 +0900] [612636] [INFO] Booting worker with pid: 612636
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612637]: [2022-04-15 17:27:42 +0900] [612637] [INFO] Booting worker with pid: 612637
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612638]: [2022-04-15 17:27:42 +0900] [612638] [INFO] Booting worker with pid: 612638
ここでサイトを開く。
ひ ら け た !!!!!!!!!!
うおおおおおおおおおおおおおおおおおおおおおお!!!
この状態で再度プロセスを確認
ps aux | grep gunicorn
XXX 612635 0.0 2.2 29660 22676 ? Ss 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612636 0.0 4.7 62252 46676 ? S 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612637 0.0 4.7 62508 46920 ? S 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612638 0.0 4.7 62252 46684 ? S 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612759 0.0 0.0 8168 716 pts/0 S+ 17:51 0:00 grep --color=auto gunicorn
デーモンモード起動時にあった
XXX 612577 0.0 1.9 29644 19336 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612578 0.2 4.7 62504 46936 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0.
の部分がなくなってる。
恐らく8000ポートで動いていたGunicornのデーモンモードを止めたことで、
GunicornとNginxが接続され、サイトが開けるようになったんだろう。
Nginxのエラーログも見てみる。
最後のエラーが17:20になっている。
解決したのが17:29なので、エラーがなくなったみたい!
本当に長い闘いだった、、、、、頑張ったよ自分
今回の闘いで、英語の記事も嫌がらずに読むことが大事だと実感した。
ほんとむずいわプログラミング。
でもエラーが解消された時の感動たるや、、、最高なんだよね
sudo vi /etc/nginx/sites-available/DjangoMyBlog
中身は下記
server {
listen 80;
server_name XXX.com
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/XXX/pyprojects/DjangoMyBlog;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket;
}
}
sites-enabledにシンボリックリンクを作り、この設定を反映させる。
sudo ln -s /etc/nginx/sites-available/DjangoMyBlog /etc/nginx/sites-enabled/
※-sオプション=シンボリックリンク化。lnコマンドをするときは大概これ。
デフォルト設定のシンボリックリンクは除外して、設定を再読込、nginxを再起動させる。
再起動
sudo systemctl restart nginx
ここで下記のエラーが出た。
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
restartをreloadに変えてもだめだった。
調べたところ、下記のコマンドで設定ファイルの検証ができるらしい。
sudo nginx -t
やってみると下記が出た
nginx: [emerg] directive "server_name" is not terminated by ";" in /etc/nginx/sites-enabled/DjangoMyBlog:5
nginx: configuration file /etc/nginx/nginx.conf test failed
サーバーネームの部分が「;」で終わってないよとのこと。
/etc/nginx/sites-available/DjangoMyBlogを見返したらXXX.comの最後に;をつけ忘れていた!
追記し、再度検証
sudo nginx -t
すると
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
できたっぽい!
再起動
sudo systemctl restart nginx
ステータス確認
sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-03-24 15:18:14 JST; 6s ago
Docs: man:nginx(8)
Process: 431980 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 431981 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 431982 (nginx)
Tasks: 2 (limit: 1147)
Memory: 2.4M
CGroup: /system.slice/nginx.service
tq431982 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
mq431983 nginx: worker process
Mar 24 15:18:14 ip-10-0-1-10 systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 24 15:18:14 ip-10-0-1-10 systemd[1]: Started A high performance web server and a reverse proxy server.
activeになった!
これでブラウザでXXX.comでアクセスできるか確認してみる。
出来ない。
マイグレーションしてみる
python3.9 manage.py migrate
マイグレーション自体は成功したっぽいが、サイトにはアクセスできない。
collectstaticしてみる
python3.9 manage.py collectstatic
You have requested to collect static files at the destination
location as specified in your settings.
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel:
なんか脅されてるし、怖いから一旦"no"
runserverしてみる
python3.9 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
March 24, 2022 - 15:30:57
Django version 3.1.5, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Error: That port is already in use.
既に8000番ポートで開いていると。
Gunicornを停止してみる
sudo pkill gunicorn
再起動
sudo systemctl restart gunicorn
再度runserver
できたけど今度はXXX.comだけでなくXXX.com:8000も開けない。なぜや。
ファイヤーウォールに80番を追加してみる。
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo ufw allow 'Nginx Full'
[sudo] password for XXX:
Rules updated
Rules updated (v6)
サイトは開けない。
困った。。
今までで飛ばしている工程がないかチェックするがよくわからない。
エラーログチェック
sudo cat /var/log/nginx/error.log
2022/03/26 00:32:02 [crit] 431983#431983: *385 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 52.39.76.92, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 00:35:46 [crit] 431983#431983: *390 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 54.189.207.101, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 00:43:52 [crit] 431983#431983: *392 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 54.202.189.63, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 00:44:24 [crit] 431983#431983: *394 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 54.68.94.169, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/", host: "XXX.com"
2022/03/26 04:38:53 [crit] 431983#431983: *415 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket failed (13: Permission denied) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET /robots.txt HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.socket:/robots.txt", host: "XXX.com"
(END)
どうやら権限がないのが問題みたい。
改めて現在のそれぞれの設定ファイルを確認する
★Gunicornの設定ファイル
XXX@ip-10-0-1-10:~$ cat /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=XXX
Group=www-data
WorkingDirectory=/home/XXX/pyprojects/DjangoMyBlog
ExecStart=/home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
[Install]
WantedBy=multi-user.target
★Nginxの設定ファイル
XXX@ip-10-0-1-10:~$ sudo cat /etc/nginx/sites-available/DjangoMyBlog
server {
listen 80;
server_name XXX.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/XXX/pyprojects/DjangoMyBlog;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock;
}
}
★Nginxの設定ファイル(大元)
XXX@ip-10-0-1-10:~$ sudo cat /etc/nginx/nginx.conf
[sudo] password for XXX:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
XXX@ip-10-0-1-10:~$
解決方法をとにかくググる
・www-dataの部分をXXXに変更?
・ユーザーXXXをwww-dataグループに追加?
・設定をnginx.confに直書きする?
・proxy_passのところをhttp://127.0.0.1:8000;に変更する?⇒これはソケットではなくhttp接続の場合なので却下
・gunicorn.socketという設定ファイルを作成する?
そもそものNginxの設定ファイルの基本的な書き方についてググる
関係図は下記
クライアント⇔Nginx⇔Gunicorn⇔Django
Nginxの実行を行なっているユーザーは誰か?
⇒www-dataユーザー
www-dataユーザーとは?
www-dataは、Ubuntu上のWebサーバー(Apache、nginxなど)がデフォルトで通常の操作に使用するユーザー
あくまでデフォルトであり、セキュリティ的観点からwww-dataではなく他のユーザーを作って割り当ててたりもする模様
NginxとGunicornの接続方法には「①ソケット接続」と「②HTTP接続」の2つがあるが、
自分が参考にした記事はそれぞれどっちか?
「Snow Tree in June」によると、http接続の場合はgunicornの設定ファイルは作成せず、単にバックグラウンドでバインドするのみだった。
よって設定ファイルを作っている記事は全てソケット接続なのだろう。
1つ目の記事(自動化なしに生活なし。2021年7月)
ソケット接続
2つ目の記事(トマト好きの方。2021年8月)
設定ファイルを作ってないし、nginx設定ファイルの書き方が「Snow Tree in June」と似ているので恐らくHTTP接続。
3つ目の記事(Qiitaポコツンさん。2019年9月)
同じく設定ファイルを作ってないし、nginx設定ファイルの書き方が「Snow Tree in June」と似ているので恐らくHTTP接続。
4つ目の記事(Qiitaバシさん。【丁寧解説】。2021年12月)
ソケット接続
半々だ。4つをごちゃまぜに参考にしたからエラーになっているのかも。
トマトさんのもう1つの記事(今度はAmazonLinuxではなくUbuntuなのでより自分の環境に近い。ただしサーバーはAWSではなくさくらVPS)では、Gunicornの設定ファイルを書いていた。
この観点をもって再度5つの記事を見直してみよう。
よくわからないーーー。
もうヤケや!色々やったる。
www-dataグループにXXXを追加
sudo usermod -G www-data XXX
サイトを開く
ダメ
www-dataの部分をXXXに変更(sudo vim /etc/nginx/nginx.conf)
nginx -tで検証すると下記のエラーがおきた
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2022/04/14 12:18:46 [warn] 602250#602250: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2022/04/14 12:18:46 [emerg] 602250#602250: open() "/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
一旦戻す
念のため再度nginx -t
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ nginx -t
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2022/04/14 12:19:41 [warn] 602256#602256: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2022/04/14 12:19:41 [emerg] 602256#602256: open() "/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
ありゃりゃ同じエラーやんけ。なぜや。
もう疲れてきたぞ、、
エラーをちゃんと見る
「エラーログファイルを開けません。(権限エラー)
userの指定はマスタープロセスがスーパーユーザー権限で実行された場合のみOKです。/etc/nginx/nginx.confの1行目で無視された。
/etc/nginx/nginx.confの構文はOK。
/run/nginx.pidは失敗(権限エラー)
/etc/nginx/nginx.confのテストは失敗」
全体的に権限エラーっぽい。
「/etc/nginx/nginx.confの1行目」とあるが、そこがuser=www-dataになっている。
あれ、もしかしたらそこに「;」が抜けてるかも?
と思いsudoで確認しようとしたところ、XXXにsudo権限がないとのこと。
補助グループをwww-dataに変えたからか。グループって2つまでしか入れないんか。
久々にubuntuに切り替え、再度XXXの補助グループをsudoに変更(ubuntu消さなくてよかったー笑)
sudo usermod -G sudo XXX
無事sudoグループに変更できた。
早速XXXに切り替えて確認してみる。
しかし「;」はついていた。
ふと思い出して、sudoつきで、nginx -tをしてみる
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
できた!
そういえばnginx -tコマンドはsudoつけなきゃだったじゃんね、、うっかり。
さて、本題に戻る。
なぜサイトが開けないのか。
最後に開けた段階まで戻ってみよう。
念のため再度gunicornコマンドを打ってみる
gunicorn --bind 0.0.0.0:8000 config.wsgi
すると
command gunicorn not foundと出た。
仮想環境に移動し、再実行。同じ。
pip listをすると確かにインストールされているのでおかしい。
以前パスの問題があったから、同じかなと思いパスを確認
echo $PATH | sed -e 's/:/\n/g'
すると消えてた。
なぜ?一度ubuntuでログインしてから切り替えたからかな?
ログインシェルはログイン時に読み込まれるからそれかも。
一度TeraTermを閉じ、再度XXXでログインする。
再度仮想環境に移動し、gunicornコマンドを打つと、無事実行できた。
サイトを見てみる。
するとなぜか開けた!!
あれ、てかそもそもなんで開けない状態になったんだっけ?
そしてこれはNginxを使って見れている状態なのか?
状況を再度整理する。
そうだ。問題はXXX.com:8000ではアクセスできるけど、XXX.comでアクセスできないことだ。
状況としてはgunicornコマンドを実行すれば8000でアクセスはできる。
しかし、XXX.comにアクセスすると「502 Bad Gateway」エラーになる。
これを表示させたい。
再度エラーログをよく見てみる
sudo cat /var/log/nginx/error.log
。。。
2022/04/15 13:06:44 [crit] 591504#591504: *522 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 35.201.0.148, server: XXX.com, request: "GET /sito/wp-includes/wlwmanifest.xml HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/sito/wp-includes/wlwmanifest.xml", host: "XXX.com"
2022/04/15 14:38:16 [crit] 591504#591504: *553 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 92.118.36.208, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
2022/04/15 16:26:05 [crit] 612240#612240: *1 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
日本語訳
unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock への接続に失敗しました。(権限エラー)
Nginxの実行ユーザはwww-dataさん。
この人に、/home/XXX/pyprojects/DjangoMyBlog/config.sockへの権限がないってことかな。
再度、www-dataの部分をXXXに変更してみる
sudo vim /etc/nginx/nginx.conf
今度はちゃんとsudoつきで検証してみる
sudo nginx -t
すると成功!
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
一応再起動
sudo systemctl restart nginx
サイト(XXX.com)を開いてみる
同じく「502 Bad Gateway」エラー。
再度エラーログを見てみる。
2022/04/15 16:44:50 [crit] 612240#612240: *4 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (13: Permission denied) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
2022/04/15 17:04:13 [crit] 612464#612464: *1 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (2: No such file or directory) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
2022/04/15 17:04:14 [crit] 612464#612464: *1 connect() to unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock failed (2: No such file or directory) while connecting to upstream, client: 210.170.175.69, server: XXX.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock:/", host: "XXX.com"
お!エラーが変わった!
日本語訳
unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock への接続に失敗しました。(そんなファイルはありません)
そんなファイルはない??
確かにそのディレクトリにいくとconfig.sockというファイルはない。
再度このエラー文でぐぐる。
・sockファイルを作らなきゃいけない?
・gunicornのの設定ファイルをきちんと書けばsockファイルは自動で生成されるのでマニュアルで作成不要?
色々な情報があったが、
下記サイト
https://www.datadoghq.com/blog/nginx-502-bad-gateway-errors-gunicorn/
で、原因は
・Gunicornが動いていない
・NginxがGunicornとコミュニケーションできない
・Gunicornがタイムアウトしている
と書いてあった。
この記事を見ている中で、自分のgunicornが8000番ポートで動かしていることを思い出した。
考えてみたら8000番で動いてたら80番で動けないんじゃ、、、?
プロセスを確認する。
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ ps aux | grep gunicorn
XXX 612200 0.0 1.9 29644 19396 ? S 16:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612250 0.0 4.2 60372 42456 ? S 16:26 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612548 0.0 0.0 8168 720 pts/0 S+ 17:17 0:00 grep --color=auto gunicorn
プロセスを止める
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo pkill gunicorn
再度プロセスを確認
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ ps aux | grep gunicorn
XXX 612559 0.0 0.0 8168 716 pts/0 S+ 17:19 0:00 grep --color=auto gunicorn
再度デーモンで8000番で実行
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ gunicorn --bind 0.0.0.0:8000 config.wsgi -D
Gunicornを再起動
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo systemctl restart gunicorn
再度プロセスを確認
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ ps aux | grep gunicorn
XXX 612577 0.0 1.9 29644 19336 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612578 0.2 4.7 62504 46936 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612594 2.6 2.3 29660 22936 ? Ss 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612595 4.1 4.2 60376 42308 ? S 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612596 4.1 4.2 60376 42308 ? S 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612597 4.1 4.2 60376 42312 ? S 17:23 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-lo gfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612599 0.0 0.0 8168 652 pts/0 S+ 17:23 0:00 grep --color=auto gunicorn
最後が切れててわからないけど、デーモンモードONで再起動したから、
そのままデーモンモードで再開したと思われる
ステータス確認
(awsmyblogenv) XXX@ip-10-0-1-10:~/pyprojects/DjangoMyBlog$ sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-15 17:23:19 JST; 1min 32s ago
Main PID: 612594 (gunicorn)
Tasks: 4 (limit: 1147)
Memory: 92.5M
CGroup: /system.slice/gunicorn.service
tq612594 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
tq612595 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
tq612596 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
mq612597 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX>
Apr 15 17:23:19 ip-10-0-1-10 systemd[1]: Started gunicorn daemon.
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:23:19 +0900] [612594] [INFO] Starting gunicorn 20.1.0
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:23:19 +0900] [612594] [INFO] Listening at: unix:/home/XXX/pyprojects/D>
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:23:19 +0900] [612594] [INFO] Using worker: sync
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612595]: [2022-04-15 17:23:19 +0900] [612595] [INFO] Booting worker with pid: 612595
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612596]: [2022-04-15 17:23:19 +0900] [612596] [INFO] Booting worker with pid: 612596
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612597]: [2022-04-15 17:23:19 +0900] [612597] [INFO] Booting worker with pid: 612597
lines 1-19/19 (END)
今度はデーモンモードを止めてから再起動してみる
プロセスをとめる
sudo pkill gunicorn
ステータス確認
sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Fri 2022-04-15 17:26:46 JST; 2s ago
Process: 612594 ExecStart=/home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoM>
Main PID: 612594 (code=exited, status=0/SUCCESS)
Apr 15 17:23:19 ip-10-0-1-10 gunicorn[612597]: [2022-04-15 17:23:19 +0900] [612597] [INFO] Booting worker with pid: 612597
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [INFO] Handling signal: term
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612595]: [2022-04-15 17:26:46 +0900] [612595] [INFO] Worker exiting (pid: 612595)
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612596]: [2022-04-15 17:26:46 +0900] [612596] [INFO] Worker exiting (pid: 612596)
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612597]: [2022-04-15 17:26:46 +0900] [612597] [INFO] Worker exiting (pid: 612597)
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [WARNING] Worker with pid 612595 was terminated due to si>
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [WARNING] Worker with pid 612597 was terminated due to si>
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [WARNING] Worker with pid 612596 was terminated due to si>
Apr 15 17:26:46 ip-10-0-1-10 gunicorn[612594]: [2022-04-15 17:26:46 +0900] [612594] [INFO] Shutting down: Master
Apr 15 17:26:46 ip-10-0-1-10 systemd[1]: gunicorn.service: Succeeded.
再起動する
sudo systemctl restart gunicorn
ステータス確認
sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-15 17:27:42 JST; 5s ago
Main PID: 612635 (gunicorn)
Tasks: 4 (limit: 1147)
Memory: 93.1M
CGroup: /system.slice/gunicorn.service
tq612635 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
tq612636 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
tq612637 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
mq612638 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/p>
Apr 15 17:27:42 ip-10-0-1-10 systemd[1]: Started gunicorn daemon.
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612635]: [2022-04-15 17:27:42 +0900] [612635] [INFO] Starting gunicorn 20.1.0
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612635]: [2022-04-15 17:27:42 +0900] [612635] [INFO] Listening at: unix:/home/XXX/pyprojects/Djang>
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612635]: [2022-04-15 17:27:42 +0900] [612635] [INFO] Using worker: sync
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612636]: [2022-04-15 17:27:42 +0900] [612636] [INFO] Booting worker with pid: 612636
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612637]: [2022-04-15 17:27:42 +0900] [612637] [INFO] Booting worker with pid: 612637
Apr 15 17:27:42 ip-10-0-1-10 gunicorn[612638]: [2022-04-15 17:27:42 +0900] [612638] [INFO] Booting worker with pid: 612638
ここでサイトを開く。
ひ ら け た !!!!!!!!!!
うおおおおおおおおおおおおおおおおおおおおおお!!!
この状態で再度プロセスを確認
ps aux | grep gunicorn
XXX 612635 0.0 2.2 29660 22676 ? Ss 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612636 0.0 4.7 62252 46676 ? S 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612637 0.0 4.7 62508 46920 ? S 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612638 0.0 4.7 62252 46684 ? S 17:27 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/XXX/pyprojects/DjangoMyBlog/config.sock config.wsgi:application
XXX 612759 0.0 0.0 8168 716 pts/0 S+ 17:51 0:00 grep --color=auto gunicorn
デーモンモード起動時にあった
XXX 612577 0.0 1.9 29644 19336 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0. 0.0:8000 config.wsgi -D
XXX 612578 0.2 4.7 62504 46936 ? S 17:20 0:00 /usr/local/bin/python3.9 /home/XXX/.local/bin/gunicorn --bind 0.0.
の部分がなくなってる。
恐らく8000ポートで動いていたGunicornのデーモンモードを止めたことで、
GunicornとNginxが接続され、サイトが開けるようになったんだろう。
Nginxのエラーログも見てみる。
最後のエラーが17:20になっている。
解決したのが17:29なので、エラーがなくなったみたい!
本当に長い闘いだった、、、、、頑張ったよ自分
今回の闘いで、英語の記事も嫌がらずに読むことが大事だと実感した。
ほんとむずいわプログラミング。
でもエラーが解消された時の感動たるや、、、最高なんだよね