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

CentOS7でnginx(VirtualHost)/uWSGI(+Supervisor)/Django(Python)メモ

More than 3 years have passed since last update.

自分の環境のメモです。構成の参考になれば。
初学者なので不完全なところが多いともいますのでご注意を。

やりたいこと

既にexample.comというドメインを持っていて、以下のような感じでサブドメインで捌けるようにしたかった。

  • aaa.example.com => 通常のWebホスティング
  • xxx.example.com => Djangoのプロジェクト
  • yyy.example.com => Railsのプロジェクト

これをVirtualHostというらしい(ひとつのIPに複数のホストを割り当てることかな?)。なおサブドメインのDNS登録は別のところで行っている。
今回はその手始めとして、あるサブドメインへのアクセスをDjangoのプロジェクトに飛ばす構成のメモ。
超絶便利なDoker用リポジトリの設定ファイルを読み解く感じで進めた。

使うもの

  • CentOS7: 一年ぐらい稼働していて色々入ってる
  • Django: 本体のWebアプリケーション
  • nginx: VirtualHostを実現するWebサーバー
  • uWSGI: Pythonサーバー
  • supervisor: uWSGIなどを簡単にデーモン化する
  • php-fpm: おまけ(Webホスティング用)

前提

  • Djangoのプロジェクトはpython manage.py runserverですでに稼働する状況。

nginxの導入

  1. nginxをインストールする
  2. apacheを停止する
    • systemctl stopじゃなくてsystemctl disable
  3. nginxを開始する

nginxのVirtualHost

設定ファイルは/etc/nginx/conf.d/に設置する。なおこの設定が読み込まれる所以は/etc/nginx/nginx.confに書かれている。「nginxでvirtualhostを設定する」と「CentOSにてnginxでPHPを動かす」の2つがとても分かりやすくを眺めるだけで分かる。基本は以下の設定で、これを増殖させれば色んなサブドメインへのアクセスを各々捌けるようになるらしい。めっちゃ簡単。

server { server_name xxx.example.com; }

uWSGIとsupervisorの導入

  1. pip instal uwsgi
  2. Django起動用のuWSGI設定hoge.iniを書きuwsgi --ini hoge.wsgiで動かしてブラウザアクセスを確認
  3. yum install supervisor + systemctl enable supervisor(念のため)
  4. /etc/supervisord.d/fuga.iniにDjango+uWSGIアプリ管理用の設定を記述する

uWSGI

よく分かっていないがuwsgi (モジュールパス).uwsgiでモジュールを実行できるようだ。なおWSGI => uWSGIということらしい(何がだ)。
使い方を検索するとuwsgi --http xxx hoge.wsgiとかuwsgi --socket xxxx hoge.wsgiとかいろいろな実行例がある。しかし結局は設定をすべてiniファイル(uwsgi.ini)にまとめてuwsgi --ini uwsgi.iniとして動かすことになるので目をくれる必要はない。

supervisor

DjangoはuWSGIでという記述が散見されたが、uWSGIをどうデーモン化するのかよく分からなかった。init.dとかserviceとかsystemctlのアレコレで可能なのだろうがよく分からないし怖い。調べたらそれらの代替としてとっつきやすそうなsupervisorが見つかった。/etc/supervisord.d/の中でデーモン系コマンドをいい感じで実行するための設定ファイルfuga.iniを書く。この設定が読み込まれる所以は/etc/supervisord.confに書かれている。参考: Supervisorで簡単にデーモン化

nginxをuWSGIと連携させる

uWSGIでnginxの連携にはUnixソケット通信かローカルTCP通信を用いる。最初は何となくUnixソケットを試みたが設置場所と権限のいろいろに躓きそもそもUnixソケットって何だっけとなったからhost:port通信にした。uWSGI側の設定はポートを聞くだけだ。nginx側は以下の設定で通信をできるようになり、あと参考設定を元にうまいことやる。

upstram uwsgiapp { server 127.0.0.1:(hoge.iniで設定したポート); }

以上

上手くいけばブラウザからhttp://xxx.example.com/にアクセスするとDjangoアプリが見られるはずだ。
3時間くらい掛けたけど振り返ってみるとわりと簡単だ。分かってないことも多いけど。

分かっていないこと

  • Unixソケット
  • WSGIとuWSGIのはたらき
  • supervisorを使わずにデーモン化する
tkynd
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