Centos 7での環境設定Nginx+uWSDi+Django


先月Pythonの基礎をいくつか学び、Djangoという強力なフレームワークがあることを知った.
既存のAWSサーバーが手元にある以上、うまく利用しないといけない.
初歩的な理解を経て、Centosの下でDjangoを構築する最も王道の組み合わせは  Nginx + uWSGI + Django
一.  インストールNginx
Nginxは有名なhttp逆エージェントサーバで、大量のアクセス要求に同時に対応することができます.
このような強力なnginxは、PHPなどの他のダイナミックサイトを搭載することもできます.
yum -y install nginx

次に、nginxの基本機能のテストを行い、nginxサービスを開始した後、他のデバイス上でブラウザでこのAWSホストにアクセスすると、ホストのファイアウォールがポート80のアクセス許可を開いているのは当然である.
systemctl start nginx

ブラウザのページが大きく表示されているのを見ると  Welcome to nginx! サービスが正常にインストールされ、正常に動作していることを示します.
二.  Python 3のインストール
uWSDIもDjangoもpythonのpipでインストールできますが、その前にpythonをインストールする必要があります.
CentOS 7システムにはPython 2が付属していますが、python 2が近い将来サポートを停止することを考慮して、より将来性のあるpython 3を選択します.
しかしながら、従来のpython 2を簡単に乱暴に削除することはできず、システムの多くの機能(例えばyum)と密接に結合しているため、python 2を保持しながらpython 3をインストールすることができる.
ネット上の大物の操作方法を参考に、いくつかのステップに分けて行います
1. 依存パッケージのインストール
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
2. python 3ソースコードをダウンロードして解凍します
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xztar -xvJf  Python-3.6.2.tar.xzcd Python-3.6.2
3. コンパイル
ターゲットインストールディレクトリを作成し、構成で指定します.
mkdir/usr/local/python3 
./configure --prefix=/usr/local/python3
コンパイルインストールの開始
make && make install
4. ソフトリンクの設定
どのディレクトリでもpython 3を使用できるように、最後にpython 3のコマンドをシステムコマンドディレクトリにリンクする必要があります.
python 3のpipはpythonとともにデフォルトでインストールされ、別途インストールする必要はありません.
ln -s/usr/local/python3/bin/python3/usr/bin/python3
ln -s/usr/local/python3/bin/pip3/usr/bin/pip3
三. uWSDIのインストール
uWSDI自体もwebサーバですが、性能が低いため、nginx中継でより良い効果を発揮できます.
1.pipでuWSDiをインストールする 
pip3 install uwsgi
同様にuwsgiを任意のディレクトリで使用できるようにするために、ソフトリンクも作成します.
ln -s/usr/local/python3/bin/uwsgi/usr/bin/uwsgi
2.単独でuwsgi機能を簡単にテストする
次に、ネットワーク上の上級者のチュートリアルに基づいて、任意のディレクトリにテスト用pythonスクリプト(test.py)を作成します.
内容は次のとおりです.簡単な関数を定義します.内容は2行しかありません.
def application(env, start_response):    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
なお、returnとしてコンテンツを返す[b"Hello World"] python 3用、 python 2の場合はreturn[Hello World]のみ
図の便宜上、ファイアウォールを変更する必要はなく、ポート80を使用してテストを継続し、nginxサービスをオフにします.
systemctl stop nginx
uwsgiサービスを開き、ポートと応答ファイルを指定すると、コマンドウィンドウはCtrl+Cを使用するまで一時的にコマンドpendによって閉じられます. サービスを終了
uwsgi --http :80 --wsgi-file test.py
なお、IPアドレスは省略するため、:80 前にスペースを
最後に他のデバイスのブラウザでAWSサーバーにアクセスすると画面左上に表示されます Hello World
テスト成功
四. Djangoのインストール
1.pipでDjangoをインストールする
pip3 install django
2. Django基本機能テスト用エンジニアリングの作成
ディレクトリをDjango管理スクリプト(django-admin)の場所にカットすることに注意してください.
スクリプトの実行を管理するにはpython 3の接頭辞を付ける必要があります.そうしないと、python 2がデフォルトで実行され、エラープロンプトにこのコマンドがありません.
cd/usr/local/python3/bin/
python3 django-admin startproject test_project
3. nginxが起動しない状態でテスト用エンジニアリングのサービスを開く
python3 manage.py runserver 0.0.0.0:80
このコマンドで指定したIP 0.0.0.0 ローカルアドレス
また、他のデバイスでブラウザでAWSにアクセスすると、最初のアクセス時にブラウザに次のエラーが表示される可能性があります.
DisallowedHost at/Invalid HTTP_HOST header
これは、本工事の許可アクセスHOSTを修正していないためである
プロジェクトディレクトリの下にあるプロファイルの変更
vi  test_project/settings.py
検索先  ALLOWED_HOSTS = [ ] すべてのHOSTへのアクセスを許可するために、以下の変更を行います.
ALLOWED_HOSTS = ['*']
ブラウザでの再アクセスに成功し、画面中央に表示 The install worked successfully! Congratulations!
五. Django+uWSDi+Nginx接続
1.Django構成
HTTPリクエストはいずれもNginx経由ですが Djangoに移動して処理しますが、ページ表示不可分割の一部として、静的ファイル(CSS,JS など)のお願いでこのような道を歩くことはできません.
この問題はページCSSファイル要求の失敗として表現され,ブラウザにはスタイルなし,すなわち乱雑で美感のない内容が表示される.
解決策は,静的ファイルの要求処理をDjangoに渡さず,直接Nginxによって処理することである.
この目標を達成するには,まず静的ファイルをすべて位置決めして整理し,あちこちに分散すればNginxは処理できない.
Pythonの各アプリのディレクトリには独自の静的ファイルがあるので、Pythonが提供する機能を利用して、各アプリの静的ファイルを一つのディレクトリに統一して整理します.
プロジェクトルートの下にサブディレクトリstaticを新規作成し、settings.pyファイルを構成します.
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  

STATIC_URL = '/static/'  
STATIC_ROOT =  os.path.join(BASE_DIR,'static')  

Pythonの静的ファイル転送コマンドの再実行
python manage.py collectstatic  

2.uWSDI設定
uWSGIはiniプロファイルを読み込むように起動し、Djangoに関する情報はすべてiniファイルに記録され、iniファイルは任意の場所に置くことができる.
前のステップで作成したDjangoプロジェクトをオブジェクトとして、プロジェクトのメインディレクトリの下にファイルを作成します.
cd/usr/local/python3/bin/test_project
vi test_proj.ini
iniファイルの内容は以下の通りです.
# test_proj.ini file[uwsgi]
# Django-related settings
#uwsgiの対外socketインタフェース、nginxはこのインタフェースを通じてuwsgiとデータ交換を行います.nginxと同じサーバ内にあるため、ファイアウォール上でポート8090にアクセス許可を与える必要はありません.
socket = 127.0.0.1:8090
# the base directory (project full path)
同前 このレコードDjangoオブジェクトエンジニアリングの完全なパス
chdir           =/usr/local/python3/bin/test_project
# Django s wsgi file
同前 この項は、Djangoプロジェクトディレクトリの下にあるプロジェクト名と同じ名前のサブフォルダ内にあるuwsgi.pyファイルの場所を示します(設定は   フォルダ名.wsgi)
module          = test_project.wsgi# process-related settings# mastermaster          = true# maximum number of worker processesprocesses       = 4# ... with appropriate permissions - may be needed# chmod-socket    = 664# clear environment on exitvacuum          = true# pidfile for record run pid pidfile        =pid.uwsgi# run process background and save log to daemonizedaemonize    = UWSGI.log
最後にiniファイルの構成に基づいてuwsgiを起動します サービス
uwsgi --ini  test_proj.ini
このような起動はコマンドウィンドウを占有しません
小贴士:uWSDiはNginxのように起動と停止のための専門的なコマンドを持っていません.uWSDIの構成を変更する場合は、次のLinuxコマンドでuWSDI関連プロセスを強制的に終了します.
pkill -f -9 uwsgi
プロセスが閉じられているかどうかを確認するプロセスリストの確認    ps aux|grep uwsgi
3. Nginx設定
nginxのプロファイルの変更
vi/etc/nginx/conf.d/default.conf
サーバ構成の内容は以下のように変更します.
server {    listen       80;    server_name  localhost;    #charset koi8-r;    #access_log /var/log/nginx/host.access.log  main;    access_log     /var/log/nginx/myweb_access.log;    error_log       /var/log/nginx/myweb_error.log;    client_max_body_size 75M;    location/{        include uwsgi_params;        #この行はuwsgiオープンデータ交換インタフェースを指定します        uwsgi_pass 127.0.0.1:8090;        #ここではuwsgiを構成するiniファイルのmodule内容と一致します.        uwsgi_param UWSGI_SCRIPT test_project.wsgi;        #ここではuwsgiを構成するiniファイルのchdirコンテンツと一致します.        uwsgi_param UWSGI_CHDIR /usr/local/python3/bin/test_project;
    }
    location ^~/static/{        root/home/test_project/;        #この行は静的ファイルの検索ディレクトリを指定します.localhost/static/test.css=>/home/test_project/static/test.css        #なお、ここでlocation行で指定したアドレスも変換後のアドレスにあります    }
次にnginxを再起動します
systemctl  リタータ  nginx
最後に他のデバイスでブラウザでAWSにアクセスし、Djangoの簡単なテストと同じように、
ブラウザにThe install worked successfully!Congratulations!