自分の環境のメモです。構成の参考になれば。
初学者なので不完全なところが多いともいますのでご注意を。
やりたいこと
既に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の導入
- nginxをインストールする
- EPEL, Remiとかある: 詳細はいつか調べる
- yumリポジトリ一追加リスト 完全版
- apacheを停止する
-
systemctl stop
じゃなくてsystemctl disable
-
- 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の導入
pip instal uwsgi
- Django起動用のuWSGI設定
hoge.ini
を書きuwsgi --ini hoge.wsgi
で動かしてブラウザアクセスを確認 -
yum install supervisor
+systemctl enable supervisor
(念のため) -
/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を使わずにデーモン化する