LoginSignup
3
2

More than 3 years have passed since last update.

NginxとDjangoとuwsgiの接続と戦ってやや勝利するまでの道のり

Last updated at Posted at 2019-12-16
1 / 2

DjangoとNginxを本格的にやろうと思い立って早2週間、ようやくサーバー接続に成功!

私はflaskとwsgiとapache2で接続したことはありましたがDjangoはこれまで食わず嫌いでいました。しかしWebSocketとかを導入したくてDjangoとnginxを導入することにしました。

現在もhttp://example.com:9000」のように入力しないと表示されないのですが、バックグラウンドでuwsgiを起動させるところまではたどり着きました。

以下に苦戦した部分を書きます

環境

  • Ubuntu18.x
  • Python2.7.x

まずはnginxサーバーのインストールでまごつく

nginxサーバーを起動するまではよかったのですが

$sudo /etc/init.d/nginx restart

と入力すると起動に失敗することがありました。
以下のような表示が出ました

[....] Restarting nginx (via systemctl): nginx.serviceJob for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
 failed!

これは私のUbuntu環境だと/etc/nginx/sites-available/の中の設定ファイルが間違っていたことが原因でした。(ポートがほかのサーバーと重複していたなど)

uwsgiの仕組みがわからず大混乱

ここからが苦悩の始まりでした。uwsgiに苦しめられ結構苦戦しました。何よりノリで何とかなると思ってしまったことが失敗です。

uwsgiはnginxとDjangoアプリを結びつけるための設定値を持つ仲介的な役割を担うミドルウェアだと思ってください。いかに私のへたくそなiniファイルを貼ります。ちなみにuwsgiで大変参考になったサイトも紹介します。(英語)

これがそのサイトです

以下が私のiniファイルとその解説のコメントです。

# open_dashboard_uwsgi.ini file
[uwsgi]
project = open_dashboard
base = /home/user/Python #←自分のPythonプロジェクトのパス

chdir = %(base)/%(project)
#home = %(base)/Env/%(project)
home = %(base)/env #←自分のPython仮想環境のパス
module = %(project).wsgi:application

#uid = root
uid = user #←自分のユーザー名
master = true
processes = 2

socket = %(base)/%(project)/%(project).sock #←このソケットは自分で作ろうとしないこと
chmod-socket = 666
vacuum = true #←サーバーが切れたときにソケットを自動的に削除してくれる、結構大事

これをもとにemperorモードというものuwsgiをバックグラウンドで動かすモード(実際は複数のアプリを起動したりできたりするすごいモード)を設定しますが大体の場合以下のエラーで躓きます。

unix:///home/user/Python/open_dashboard/open_dashboard.sock failed (13: Permission denied)

これが厄介なのですがemperorモードのuidとgidを自分のユーザー名にしておくと解決できます。
あとログファイルもsudo chown user:user /var/log/uwsgi-emperor.log
など設定しておくのを忘れないでください。

.bashrcを以下のように設定します。(/etc/rc.localがよいらしいのですがとりあえず確実な方で)

/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data --daemonize /var/log/uwsgi-emperor.log

上記のコードの--emperor /etc/uwsgi/vassalsの部分ですが以下のように設定します。

# create a directory for the vassals
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
# symlink from the default config directory to your config file
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/
  • (2020/1/1更新)ユーザーはwww-dataがよいです。ソケットが作られない場合は/tmpを指定してください
  • (2020/1/1更新)Python2のuwsgiだとPython3でエラーになるのでpip3などでuwsgiを再インストールする必要があります。

駆け足になってしまいわからないこともあるかと思いますが、とりあえず
再び自分が迷わなくてもいいようにこの記事を書かせていただきました。

この記事のように502エラーばっかりでて暗い日々を過ごしていました

次はDockerに挑戦するつもりです!

改訂履歴

  • 2019/12/16 新規作成
  • 2020/1/1 Python3でやった時にuwsgiをもう一度Python3用にインストールして再設定する方法を追記
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2