おことわり
社内向けに書いたものを公開したものです。
怪しい単語を置換しているだけなので動くと思いますが、動かないかもしれません。
そしてdjangoとかあまりよくわからない人間が書いているので、内容の正確性は保証しませんし、センスが悪いのは承知です。。。
やりたいこと
nginxでuwsgi使ってdjangoをくるんでいろいろしたい。
一般ユーザだけでweb周りの開発・運用をできるような構成にしたい。
環境
Amazon Linux 2
python 3.5.5
nginx 1.12.2
Django 2.1.5
uwsgi 2.0.18
PyMySQL 0.9.3
その他もろもろ
ドメイン名 www.test-website.name
プロジェクト名 hogehoge
アプリケーション myapp
ディレクトリ構成
■ 一般ユーザだけで完結させるために、djangoログとnginxログを全部/hogehogeROOT/logs配下にまとめた
■ hogehogeROOT配下のディレクトリやファイルのOWNERはfugaaplで統一
=> 「makemigrationsができるけどcollectstaticできない」「collectstaticできるけどmakemigrationsできない」問題がこれで解決。
■ ついでにconfigもhogehogeROOT/confに集約して、nginxとかsystemdにシンボリックリンクで渡した
=> hogehoge絡みのconfigはほぼすべてここでコントロールできるので、管理性が向上。
/hogehogeROOT
|-- hogehoge <------------------projectroot
| |-- manage.py
| |-- myapp <---------------startappしたやつ
| | |-- __init__.py
| | |-- __pycache__
| | |-- admin.py
| | |-- apps.py
| | |-- migrations
| | |-- models.py
| | |-- tests.py
| | |-- urls.py
| | `-- views.py
| |-- hogehoge
| | |-- __init__.py
| | |-- __pycache__
| | |-- settings.py
| | |-- urls.py
| | `-- wsgi.py
| `-- static
| `-- admin
|-- conf
| |-- test-website.name.conf
| |-- uwsgi-hogehoge.service
| |-- uwsgi.ini
| `-- uwsgi_params
`-- logs
|-- djangolog
| `-- hogehoge.log
`-- nginx
|-- hogehoge-error_log
`-- hogehoge-access_log
##Config
uwsgiなconfigたち
config | 説明 |
---|---|
uwsgi-hogehoge.service | serviceコマンドでuwsgiを動かすためのconfig |
uwsgi.ini | uwsgiを起動するためのconfig。service uwsgi-hogehogeから読まれる。 |
uwsgi_params | 謎のuwsgi_params。お作法的な? |
[Unit]
Description=uWSGI service for mysite
[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /var/run/uwsgi.hogehoge; chown root:fugaapl /var/run/uwsgi.hogehoge; chmod g+w /var/run/uwsgi.hogehoge'
ExecStart=/bin/bash -c 'DJANGO_SETTINGS_MODULE=hogehoge.settings; uwsgi --ini /hogehogeROOT/conf/uwsgi.ini'
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
[uwsgi]
uid = fugaapl
gid = fugaapl
chdir = /hogehogeROOT/hogehoge/
module = hogehoge.wsgi
env DJANGO_SETTINGS_MODULE = hogehoge.settings
pidfile = /var/run/uwsgi.hogehoge/master.pid
socket = /var/run/uwsgi.hogehoge/master.sock
#http = 127.0.0.1:8000
master = true
vaccum = true
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
nginxなconfigたち
config | 説明 |
---|---|
test-website.name.conf | nginxのconf |
server {
listen 80;
server_name www.test-website.name;
access_log /hogehogeROOT/logs/nginx/hogehoge-access_log main;
error_log /hogehogeROOT/logs/nginx/hogehoge-error_log;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi.hogehoge/master.sock;
}
location /static/ {
root /hogehogeROOT/hogehoge/;
}
}
設定方法
djangoは入ってる前提で。
urls.pyとかその辺は適宜好きなように変える。
とりあえず何も考えずrootで進める。
① nginxインストール
amazon linux exstrasで入れる。
Q:Amazon Linux Extras とは何ですか?
Extras は、安定したオペレーティングシステムで新しいバージョンのアプリケーションソフトウェアを利用可能にする Amazon Linux 2 のメカニズムで、2023 年 6 月 30 日までサポートされます。Extras は、OS の安定性を確保しつつ、最新のソフトウェアを利用できるようにするうえで役立ちます。例えば、5 年間サポートされる安定したオペレーティングシステムに MariaDB の新しいバージョンをインストールすることができます。Extras の例には、Ansible 2.4.2、memcached 1.5、nginx 1.12、Postgresql 9.6、MariaDB 10.2、Go 1.9、Redis 4.0、R 3.4、Rust 1.22.1 などがあります。
amazon-linux-extras install nginx
② uwsgiインストール
何も考えずpip install
pip install uwsgi
③ディレクトリ作成
mkdir -p /hogehogeROOT/hogehoge
mkdir -p /hogehogeROOT/conf
mkdir -p /hogehogeROOT/logs
mkdir -p /var/run/uwsgi.hogehoge
④とりあえずstartproject & startapp
django-admin manage.py startproject hogehoge
django-admin manage.py startapp myapp
⑤ uwsgiのconfigを作成
cd /hogehogeROOT/conf
vim uwsgi.ini
vim uwsgi-hogehoge.service
⑥ uwsgiをsystemctlとかserviceで動くように、シンボリックリンクを設定&確認
ln -s /hogehogeROOT/conf/uwsgi-hogehoge.service /etc/systemd/system/uwsgi-hogehoge.service
ll /etc/systemd/system/uwsgi-hogehoge.service
⑦とりあえずdaemon-reload
systemctl daemon-reload
⑧ uwsgiがsystemctlとかserviceで動いてくれるか確認
systemctl start uwsgi-hogehoge
systemctl status uwsgi-hogehoge
sytemctl stop uwsgi-hogehoge
systemctl status uwsgi-hogehoge
⑨ nginxのconfigを作成
cd /hogehogeROOT/conf
vim test-website.name.conf
⑩ nginxのconf.d配下にシンボリックリンクを張る
cd /etc/nginx/conf.d/
ln -s /hogehogeROOT/conf/test-website.name.conf test-website.name.conf
ll test-website.name.conf
⑪ nginx.confを修正する
ユーザを/var/run/uwsgi.hogehogeのグループに属するユーザに変更する。
変えとかないとpidファイルとsocketが作れなくて、PermissionDeniedでコケる。
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user fugaapl; <-----------ユーザを変更する
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
~以下略~
⑫ nginxが動いたり止まったりするか確認する
systemctl start nginx
systemctl status nginx
systemctl stop nginx
systemctl status nginx
⑬ uwsgiとnginxを起動する
systemctl uwsgi-hogehoge start
systemctl nginx start
⑭ 外部から叩いてみる
https://test-website.name
-> djangoの404画面が返ればOK
⑮ ログ出力を確認する 1
tail /hogehogeROOT/logs/djangolog/hogehoge.log
tail /hogehogeROOT/logs/nginx/hogehoge-access_log
tail /hogehogeROOT/logs/nginx/hogehoge-error_log
-> 何かしら出てればOK
⑯ もろもろ終わったら丸ごとOWNER変更
chown -R fugaapl:fugaapl /hogehogeROOT/
備考
ドメイン名は環境に合わせて変えて。
あとは好きにして。
-
djangoログ設定はsettings.pyとかに入っている前提 ↩