diadia

興味があることをやってみる。独学で勉強しています。初心者から始めたので困ったことを書いて同じ境遇の方のヒントになればと思います。

nginxについて

nginxだけではロケットは打ち上げられない

開発段階では127.0.0.1:8000 にアクセスすればロケットが打ち上がる。

一方centos7にdjangoをインストールしてそのままpython manage.py runserverをすると、

December 18, 2018 - 18:30:37
Django version 2.1.4, using settings 'project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

と表示される。
当初は,centos7 , nginx, django,データベースを準備し、python manage.py runserverするとサーバー上でロケットが打ち上がると思っていた。

それはもちろんsettings.pyでallowed hostを登録し、DEBUG False にした条件で。しかしながら、ロケットは上がらない。

つまりnginxを入れただけではdjangoは起動できない。これが結論だ。

nginxの他にgunicornを使わないと、特定のURLでロケットを打ち上げられない。ここまではっきりした。またuwsgiはnginxが受けたものを渡し、uwsgiがdjangoを動かすようだ。
てことで、centos7,nginx,django,python,uwsgiが必要となる。
https://www.mathpython.com/ja/django-nginx-conf/

おそらくdjangoを動かすアプリケーションサーバが、uwsgiである。nginxはクライアントのリクエストが静的ファイルなら静的ファイルを配信する。リクエストがdjangoのアプリケーションの範疇ならuwsgiに渡す役割である。そしてuwsgiを起動させるコマンドとしてpython manage.py runserverがある。これはnginxと連携しない。nginxと連携しながら、wsgiを起動させるのがgunicorn のコマンドということではないだろうか?

sudo gunicorn --bind 127.0.0.1:8000 project.wsgi:application 

gunicornの--bindはなんなのか。分かったら更新する。


nginxドキュメントと設定ファイル

nginxドキュメントの日本語版がある。http://mogile.web.fc2.com/nginx

nginxとそのモジュールの動き方は設定ファイルで決定されます。デフォルトでは、設定ファイルはnginx.confという名前で、/usr/local/nginx/conf, /etc/nginx, または /usr/local/etc/nginxのディレクトリの中にあります。
とある。

つまりnginxではnginx.confという設定ファイルを編集することでnginxの動きを定めることができるというわけだ。

その他の方法としては、/etc/nginx/conf.d以下に設定ファイルを作成し書くという方法がある。こっちのほうがデフォルトのファイルを直接書き換えるわけではないのでおすすめのようだ。


このnginxとconfの関係は、nginxに限ったものではない。sshdsshd.confも同じ関係である。


nginxのエラーについて

400 Bad Requestがでる場合

自分の場合nginxの設定ファイルに間違いがあるときに400 Bad Requestになった。

server {
    listen  80;
    server_name 158.129.223.132/;

    location /static {
        alias /usr/share/nginx/html/static;
    }

    location /media {
        alias /usr/share/nginx/html/media;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

上記のようにserver_nameに無駄な文字が入っていることでIPが読み込まれなかった。