ホームページ >バックエンド開発 >PHPチュートリアル >uWSGI と nginx を使用して Django プロジェクトを構築する方法
前書き:
nginx と uWSGI は Django のデプロイメントに適した選択肢ですが、これらが唯一のものではありません。それらはすべて置き換え可能であり、他の試みも歓迎されます。
背景知識の簡単な紹介:
1. WSGI は Web サーバー ゲートウェイ インターフェイスです。 Webサーバー(nginxなど)とアプリケーションサーバー(uWSGIサーバーなど)間の通信の仕様です。
2. uWSGI WSGI、uwsgi、http およびその他のプロトコルを実装します。
3. Nginx は、高性能 HTTP およびリバース プロキシ サーバーです (静的ファイル リクエストを効率的に処理できるため、Nginx を使用します)
4. Django は、MVC を採用したオープン ソース Web アプリケーション フレームワークです。デザインパターン 。
5. ソケットはプロセス間通信を実装するために使用されます
使用する必要があるコンポーネントについて大まかに説明した後、手順を詳しく説明します (よく読んで、最初は必ず正しく行ってください)
完了する必要がある最終作業は基本的に次のとおりです:
クライアント (Web リクエストの作成) —— サーバー (nginx)がここで使用されます) —— ソケット (自動生成された通信ファイル) - uwsgi - Django
以下のコンテンツの多くは http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx から取得しています。 html#cconfiguring-uwsgi- to-run-with-a-ini-file
uWSGI のインストールと基本構成:
uWSGI のインストールには pip パッケージ管理ツールを使用します:
sudo pip install uwsgi
まだ pip をお持ちでない場合は、インストールしてください:
Debian および Ubuntu システムで使用:
sudo apt-get install python-pipFedora および CentOS システムで使用:
sudo yum install python-pipuwsgi の pip インストール中に、次のメッセージが表示されたら、インストールされていない依存関係があります:
Debian および Ubuntu:
apt-get groupinstall "開発ツール"
apt-get install python-devel
フェドーラとCentOS:
yum groupinstall "開発ツール"
yum install -y python-devel
基本テスト
テストファイルを作成するtest.py:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return ["Hello World"] # python2 #return [b"Hello World"] # python3
uWSGIを実行する
uwsgi --http :8000 --wsgi-file test.pyコードは、http プロトコル、ポート 8000 を使用してテスト ファイルをロードすることを意味します。すべて問題なければ、次のサイトにアクセスしてください。
http://127.0.0.1:8000/ (コロンは英語のコロンであることに注意してください)
おなじみのかわいいHello Worldが表示されます。これは、クライアント - uWSGI - Python 間のブリッジが開かれたことも示しています。
test.py を Django プロジェクトに置き換えます
まず、プロジェクト自体が正常に実行できることを確認し、ターミナルでプロジェクト ディレクトリに入り、次のように入力します:
python manage.py runserver 0.0.0.0:8000正常に実行できる場合は、停止しますそれを削除して次のコードを実行し、nidegongchenming をプロジェクト名に変更します:
uwsgi --http :8000 --module nidegongchenming.wsgimodule *.wsgi は wsgi モジュールをロードすることを意味します。このモジュールは既に持っているのでご安心ください。
これで、クライアント-uWSGI-Django間のブリッジが開きました。おめでとうございます。
Django プロジェクトの名前が abc の場合、その内容をすべて /var/www/ にコピーすることをお勧めします。これにより、プロジェクトの manage.py ファイルが /var/www/abc/ に配置され、ファイルのアクセス許可が原因でサービスを提供できないという問題を回避できます。
わかりました、サービスを停止しても構いません、続行しましょう。
nginxのインストールと基本構成:
nginxをインストールします
UbuntuとDebian:
sudo apt-get install nginx sudo /etc/init.d/nginx startFedoraとCentOS
sudo yum install nginx sudo service nginx startFedoraでは、サービスnginxの起動はリダイレクトされますsystemctl start nginx .service に設定します。
すべてが正常であれば (デフォルトのポート 80 が占有されていない場合)、ブラウザで 127.0.0.1 にアクセスすると、「XXX の nginx へようこそ」と表示されます
これで、ブリッジは次のようになります: クライアント - サーバー(nginx)
ポートが Apache などによって占有されている場合、nginx サービスが正常に開始できなくても問題ありません。以下では、nginx が他のポートをリッスンするように設定する方法を紹介します。
nginx を設定します
まず、このファイルは通常、/etc/nginx/ などの nginx ディレクトリにあります。また、https://github.com/nginx/nginx/blob/master/conf/uwsgi_params に移動し、コピーするか、次のコンテンツをコピーします
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 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;
ファイル名は、サフィックスなしの uwsgi_params です。これを Django プロジェクトの manage.py と同じディレクトリに置きます。次に、nginx を構成し、uwsgi_params ファイルを参照するように指示します。
Django プロジェクト ディレクトリを入力し、ファイル mysite_nginx.conf を作成し、次のように入力します:
# mysite_nginx.conf # the upstream component nginx needs to connect to upstream django { # server unix:///path/to/your/mysite/mysite.sock; # for a file socket server 127.0.0.1:8001; # for a web port socket (we'll use this first) } # configuration of the server server { # the port your site will be served on listen 8000; # the domain name it will serve for server_name .example.com; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /path/to/your/mysite/media; # your Django project's media files - amend as required } location /static { alias /path/to/your/mysite/static; # your Django project's static files - amend as required } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed } }这个文件中的内容我保留了英文文档中的注释,比较详细,可能会对你有一些意外的帮助。
server{}中的server_name可以接IP地址,比如:server_name 219.242.174.48,测试的话用你本机的吧,搭好了之后方便在同网段内使用其它机器测试。
这份配置文件告诉nginx从文件系统中建立媒体和静态文件服务,同时也处理Django应用中的请求。对于大型的部署而言,让一个服务器处理静态/媒体文件,另一个处理Django应用,会有很好的表现。不过现在,我们这么做也没问题。
然后执行下面的命令,让nginx知道有这么一个配置文件:
sudo ln -s mysite_nginx.conf /etc/nginx/sites-enabled/
部署静态文件
在运行nginx之前,必须把所有的Django静态文件收集到一个静态文件夹中,首先在settings.py中写入:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然后运行
python manage.py collectstatic
基本nginx测试
重启nginx服务
Ubuntu,Debian:
sudo /etc/init.d/nginx restartFedora,CentOS:
sudo service nginx restart 或者 systemctl restart nginx.service
为了测试我们是不是可以提供访问媒体文件的服务,找张图片比如"abc.png",放到你的Django工程中的媒体目录下,比如/var/www/project/project/media。然后访问http://127.0.0.1:8000/media/abc.png,如果有问题,需要先停止nginx(上面命令中restart改成stop),再启动。这样我们能得到一些提示信息,以便找出问题在哪。
nginx和uWSGI以及test.py的沟通
uwsgi --socket :8001 --wsgi-file test.py前面nginx已经被设置好在8001端口与uWSGI通信,同时在外界服务被布置在8000端口,访问:http://127.0.0.1:8000/
如果能看到Hell World,说明我们打通的桥梁变成:
客户端(浏览器)——服务器(nginx)——socket——uWSGI——python
同时你也可以访问http://127.0.0.1:8001/,看看uWSGI的反应,暂不剧透……
到现在我们都是在使用TCP port socket,这样开始的时候会容易些,不过实际上使用Unix sockets 会更好些,会有较小的开销。
编辑我们刚才的nginx配置文件mysite_nginx.conf,做以下更改:
server unix:///path/to/your/mysite/mysite.sock; # for a file socket # server 127.0.0.1:8001; # for a web port socket (we'll use this first)重启nginx,
停下刚才的uWSGI服务,输入以下命令重新开启:
uwsgi --socket mysite.sock --wsgi-file test.pymysite.sock文件会被自动建立,用做通信,你可以当它是个临时文件。当然不喜欢这个文件名,你也可以更改。用浏览器再访问一次8000端口,看看结果。
如果服务没能正常运行,查看一次啊nginx的错误日志,在/var/log/nginx/error.log。如果错误日志像是这样:
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission denied)那可能需要更改socket的权限,以便nginx可以使用它。
试一下:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)或者:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)可能你还需要把当前用户加入nginx用户组,反之也需要把nginx加入你当前用户的用户组。这样nginx应该就有权限访问socket文件了。
激动人心的时候要到了
现在我们可以尝试一下用uwsgi和nginx来运行我们的Django应用了。
在工程目录下运行:
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664注意mysite.wsgi要改成你的工程名。
现在应该在浏览器中能看到你的工程了。
用ini文件来配置uWSGI
创建一个文件命名为'mysite_uwsgi.ini'
# mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /path/to/your/project # Django's wsgi file module = project.wsgi # the virtualenv (full path) # home = /path/to/virtualenv # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = /path/to/your/project/mysite.sock # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true如果你使用了virtualenv,home那个位置就不能注释掉。
以后再运行 uswgi就可以使用:
uwsgi --ini mysite_uwsgi.ini进一步我们还可以让uWSGI运行在上帝模式,设置开机自动启动以及限制最大访问,工程文件大小之类的配置。
去吃饭了
这些内容我可能会在下一篇博客里写,想先了解的同学请移步:http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run-with-a-ini-file
这个文档相当全面,而且重要的是没有拼写错误这种情况。
版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了如何用uWSGI和nginx来搭建Django工程,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。