質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

2回答

2262閲覧

AWS EC2にデプロイしたアプリがGunicornで動かない

k_takahashi

総合スコア6

Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

0クリップ

投稿2021/05/19 08:54

編集2021/05/20 00:30

わからないこと

ローカルで開発していたアプリケーションをAWS EC2にデプロイした際に
Gunicornがうまく動きません。

前提条件

開発しているアプリケーションの言語は、
React + Django REST frameworkです。

ローカルではDockerを使っており、
サーバーは、Djangoのrunserverを使っています。

このアプリケーションをAWS EC2にデプロイするにあたって、
NginxでReactを動かして、GunicornでAPIを動かす想定です。

現状どうなっているか

nginx.confの設定をして、画面を表示することはできたため、
次にGunicornの起動をしようとしました。

pip install gunicorn cd [manage.pyのあるディレクトリ] gunicorn --bind 127.0.0.1:8000 [プロジェクト名].wsgi

上記コマンドを実行して、
下記の通り、Gunicornのプロセスの起動自体はできました。

sh-4.2$ ps ax|grep gunicorn 12392 ? S 0:00 /home/ssm-user/[プロジェクト名]-venv/bin/python3 /home/ssm-user/[プロジェクト名]-venv/bin/gunicorn --bind 127.0.0.1:8000 [プロジェクト名].wsgi -D 12395 ? S 0:00 /home/ssm-user/[プロジェクト名]-venv/bin/python3 /home/ssm-user/[プロジェクト名]-venv/bin/gunicorn --bind 127.0.0.1:8000 [プロジェクト名].wsgi -D 12469 pts/0 S+ 0:00 grep gunicorn

しかし、ローカル環境では、runserverすれば接続できていたページに接続できませんでした。

Gunicornのsocketファイルやserviceファイル等も試してみたのですが、
うまくいきませんでした。

どうしたいか

Django REST frameworkで作成したAPIを、Gunicornで起動するための
設定方法を教えていただけますと嬉しいです。

作成した設定ファイル

  • ↓プロジェクト構成
[プロジェクト名]  │  ├ Dockerfile  ├ README.md  ├ db.sqlite3  ├ docker-compose.yml  ├ package-lock.json  ├ requirements.txt  │  ├ backend  │ ├ __init__.py  │ ├ api  │ ├ manage.py  │ └ [プロジェクト名]  │  └ front   ├ README.md   ├ package-lock.json   ├ package.json   ├ public   ├ src   └ yarn.lock
  • ↓ /etc/systemd/system/[プロジェクト名].socket
[Unit] Description=gunicorn socket [Socket] ListenStream=/home/ssm-user/[プロジェクト名]/backend/[プロジェクト名].sock [Install] WantedBy=sockets.target
  • ↓ /etc/systemd/system/[プロジェクト名].service
[Unit] Description=gunicorn daemon Requires=[プロジェクト名].socket After=network.target [Service] User=ssm-user Group=ssm-user WorkingDirectory=/home/ssm-user/[プロジェクト名]/backend ExecStart=/home/ssm-user/[venv名]/bin/gunicorn –workers 3 –bind /home/ssm-user/[プロジェクト名]/backend/[プロジェクト名].sock [プロジェクト名].wsgi:application [Install] WantedBy=multi-user.target
  • ↓nginx.conf_一部抜粋
server { listen 80; server_name [EC2のIP]; location / { proxy_pass http://localhost:3000; } # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

他の方も書いていますが、それぞれが受け取ろうとしてる状態が違います。

1)nginx.confの設定を使用する場合
nginxはlocalhostの3000番portに受け渡しているので、gunicornも3000番でやり取りさせます。
gunicorn --bind 127.0.0.1:3000 [プロジェクト名].wsgi
これをオプションでデーモンモードで実行すればバックグラウンドで動いてくれます。
なので、.seviceファイルも.socketファイルもいらないです。
もしくは.serviceファイルでgunicornを実行するようにする(これはやったこと無いでの確認してませんが)

2)sockファイルを使用する場合
.serviceと.socketをそのまま使用する場合.sockファイルを介してgunicornがやり取りします。

今の状況ではnginxは駅の東口(3000port)で待機しているのに、gunicornは西口(8000port)に行っていnginxないなーと思って、もう一度駅の中(.sock)に戻ってnginxいないなーってなって出会えてない感じです。(厳密には違うけど)

投稿2021/05/23 09:13

kyokio

総合スコア560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

やってるアクションがバラバラなように見えます。

  • nginx.conf: Gunicornがlocalhost:3000で待ち受けている前提の設定をしている
  • Gunicorn用のservice: UNIXドメインソケットで待ち受けようとしている
  • コマンドでのGunicorn: localhost:8000で待ち受けようとしている

少なくとも、nginx.conf上の設定でいずれかのGunicornプロセスに渡せるようにしないとだめではないでしょうか。

投稿2021/05/22 06:39

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_takahashi

2021/05/24 00:27

以下を追加したら解決しました。 ありがとうございます。 ========================================= location /api { proxy_pass http://localhost:8000; } ========================================= nginxなど、サーバーについての理解が浅かったのですが、 他の方の回答も含めて拝読させていただき、理解が深まりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問