Help us understand the problem. What is going on with this article?

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

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

by negishis
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用にインストールして再設定する方法を追記
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした