Webサーバーをセットアップするための使用方法uWSGIとDjangoとnginxの] --2019-08-06 16時01分12秒

オリジナルリンク:http://106.13.73.98/__/101/

@
***

サプリメント

ピップインストールされているすべてのパッケージを確認してください。

pip3.6 list

ファイルに導入されたすべてのPythonパッケージで、現在の環境:

pip3.6 freeze > test.txt

すべてのファイルは、現在の環境内のPythonパッケージをインストールされます。

pip3.6 install -r test.txt

これはWSGIと呼ばれる

WSGIゲートウェイインターフェイスは、WebサーバとWebアプリケーションの通信、及び方法は、(要求に応じて、要求受信、処理要求)の処理要求と、Webアプリケーションをリンクする方法について説明指定されたWebサーバです。

そこボトル、ジャンゴ、動的なHTTPリクエストを解析するためのフラスコフレームワークベースのWSGIの実行。

---------⬇️
支援WSGIサーバ

wsgiref
Pythonは、サーバに付属しています。

Gunicorn
LinuxのPythonのWSGI HTTPサーバのための、一般的に展開サーバーと組み合わせて様々なジャンゴ、フラスコ内の使用。

mode_wsgi
ApacheとWSGIアプリケーションの組み合わせを実現した。
C言語の開発、急速な、自己回復、開発者に優しいWSGIのPythonのWebアプリケーション・デプロイメントのためのサーバーとプロ開発。---------⬆️PythonのWebアプリケーションデプロイメントプログラムは、性能要件に応じて、適切なWSGIサーバを選択すると、別のサーバーのWSGI差が同時サポートにあり、シングルスレッド、マルチがあります判別処理、マルチスレッド、コルーチン、その機能は、単にルーティングを要求する同様であり、対応する機能を実行し、処理結果を返します。
uWSGI



wsgi.pyファイルDjangoの環境について
ここに画像を挿入説明
地図上でDjangoの環境でwsgi.pyファイル。

メインの配布プラットフォームDjangoはWSGI、WebサーバやアプリケーションのためのPythonの標準である。

シンプルなデフォルトを設定するには、Djangoのstartprojectの管理コマンドWSGIの設定は、私たちのプロジェクトの調整の需要に基づいて、および任意のWSGI準拠のアプリケーションサーバが使用するように指示することができます。

application重要な概念のWSGIの展開を使用すると、コードと通信するためのアプリケーションサーバでapplication呼び出すことができ、それは通常アクセス可能なサーバであります名前のPythonモジュールapplication。オブジェクトを提供する

startprojectコマンドが作成され、このような含まれapplicationたファイルを呼び出すことができます。
<project_name>/wsgi.pyそれは、その構成を取得するためにWSGIサーバ、Djangoの開発サーバの展開と生産使用のWSGIたapplicationパスを呼び出すことができます。Djangoは、サーバ、すなわち、構築されたrunserverからのコマンドをWSGI_APPLICATION、それが提供されて読書。

nginxのは、uWSGIはなぜ

まず、nginxのは、外部サービス・インターフェース、nginxのにアクセスするためのURLを介して外部のブラウザである。

その後、nginxのは、ブラウザ、パケットの解析とURLを解析することにより、送信されたHTTPリクエストを受信します。それはnginxの設定、ユーザーが要求したダイレクトリターン静的ファイルへの静的ファイルのディレクトリのユーザーに静的ファイルのアクセスを要求している場合は、静的なファイル要求(すなわち、動的な要求)でない場合は、nginxのはuwsgiする要求を転送する、後に要求を受信したuwsgiパケットWSGIを受信することができる形式に変換処理、および送信WSGI。WSGI uwsgiを受信するアプリケーションまたは機能のファイル、再度uwsgiを受信可能なフォーマットにパッケージ戻り値WSGIパッケージを、WSGIするために処理された最後の戻り値を、起動するファイル要求WSGIリクエストを送信し、nginxのに転送し、nginxのは、最終的にブラウザに値を返します。

に最後に、我々は、nginxのの第一段階が必要ではないことを知って、uwsgiは全体のプロセスを完了し、ブラウザと対話することができますが、 3例以下を考慮に入れる。

1.安全问题
直接ブラウザでアクセスすることはできませんが、nginxのことで、nginxのが唯一のインタフェースを開発。
自身がネットワークインタフェースであるuwsgi、nginxのではセキュリティ上の制限とその運用・保守要員ので、あなたが達することができるようセーバー。

2.负载均衡问题
uwsgiはそれがより多くの仕事が開いていない場合でも、十分ではないかもしれませんが、結局、マシンのCPUとメモリが限られている。
使用のnginxのエージェント、uwsgiはuwsgi完了することができますnginxのプロキシ複数負荷分散。

3.静态文件问题
ジャンゴすることにより、または完全に、静的ファイルへのアクセスは非常に無駄な動作である、ファイルの独自の処理はnginxのようではないので、全体のプロセスは、nginxのから直接静的ファイルを完了する静的ファイルを処理するための責任があるとそのuwsgiを通過uwsgi背後にあるロジック。

nginxの公式ウェブサイト:HTTP://nginx.org/en/
モジュールをuwsgiするnginxの紹介:HTTP://nginx.org/en/docs/http/ngx_http_uwsgi_module.html
***

以下は意志nginxの、WSGIとの関係、uwsgi、uWSGI、Djangoの整理。

---------⬇️
wsgi
ウェブサーバーゲートウェイインターフェイスのフルネーム、WSGIサーバーではなく、またPythonモジュールが、通信プロトコル
に使用される。ウェブ・サーバ、ウェブ・ファイル・アプリケーションと通信する方法を説明する
。フラスコ、DjangoのボトルがウェブフレームWSGI上で実行されている

uwsgi
定義するための情報を送信する、通信プロトコル、プロトコルuWSGI別個のサーバとして、およびWSGIタイプ。

uWSGI
WSGIプロトコル、uwsgi契約を実装し、。ウェブサーバである

Nginx
静的リソース、キャッシング機能、負荷分散とウェブサーバ、より安全でよりよい取り引き。
nginxのの強力なパフォーマンス、私のWSGIサーバをより安全になると、パフォーマンスが保証されています。

Django
問題のほとんどを解決するために、高度な急速な発展のためのPythonのフレームワーク、Web開発、プログラマはビジネスロジックに集中することができ、無秩序なホイールを再作成します。
---------⬆️

ロジック図:
ここに画像を挿入説明
---------⬇️
web服务器
従来のC / Sアーキテクチャ、要求プロセスである:
クライアント>サーバの
サーバ>クライアント
サーバである:1. 2.プロセスは、要求応答3を返却する要求を受信する

web框架层
HT フレームTP動的ウェブデータ、例えばMTV Djangoはモード処理要求に従います。
URLは、ビューのルート要求処理にHTTPプロトコルを使用してリソース、urls.pyビューを見つけ、その結果を返し、要求を完了。
Webユーザーのみがビジネスロジックにフレームを処理する必要があります。
--------- ⬆️

「対話」プロセスに通信した場合:
Nginxは:「WSGIこんにちは、私はちょうどそのDjangoはそれを処理させ、要求、準備ができたら、次を受けています。」
WSGI:「私はすぐに設定し、nginxの、良いです環境変数、その後、Djangoのための要求「
ジャンゴ:」WSGIありがとう、私はあなたが結果に応じて、リクエストを処理してあげる「
WSGI:」。まあ、私は「待っている
Djangoに:」それを得る、トラブルのWSGI応答結果nginxのに渡された「
WSGI:」非常に良いnginxのは、良い収入の結果にご返信ください、要求どおりに配信されている「
nginxのを:.」さて、私は顧客と楽しい協力」に対応して結果を出してあげる

***

インストールuWSGI

インストールuWSGI

# 进入虚拟环境,安装uWSGI
(venv) [root@master ~]# pip3.6 install uwsgi

# 检查uWSGI版本
(venv) [root@master ~]# uwsgi --version
2.0.17.1

# 检查uWSGI Python版本
(venv) [root@master ~]# uwsgi --python-version
3.6.7

シンプルuWSGIを実行します

test.pyファイルを次のように

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'Hello World']  # Python3

次のコマンドを実行します。

uwsgi --http :8000 --wsgi-file test.py

"""参数详解:
--http :8000  -> 使用http协议,端口8000
--wsgi-file test.py  -> 加载test.py文件
"""

実行した後、ブラウザからアクセスすることができます
ここに画像を挿入説明
***

Djangoの環境を実行uWSGI

----------------------------------
Djangoの環境コマンドを実行します

# 在项目根目录下执行如下命令
uwsgi --http :8000 --module project.wsgi

"""参数详解:
--http :8000  -> 使用http协议,端口8000
----module  -> 加载project项目下的wsgi模块
"""

.
----------------------------------
使用脚本运行Django环境
.
uWSGI支持inixml等多种配置方式.
这里将以ini为例,在/etc/目录下新建uwsgi_nginx.ini配置文件,如下:

# 项目配置文件
[uwsgi]

# 项目的绝对路径 定位到第一层
chdir = /root/project

# 指定项目的wsgi文件路径(从项目的根路径开始)
module = project.wsgi

# 指定虚拟解释器的第一层路径
home = /root/Envs/project

# 指定通过uwsgi启动多少个进程,默认2个
processes = 4

# 如果你已经配置了nginx,请使用这个socket连接
socket = 127.0.0.1:9999

# 如果你没有配置nginx,想通过uwsgi直接启动web服务,请使用这个http连接,指明http协议
# http = 127.0.0.1:9999

# 结合上面的 http 与 socket 配置项,都可以访问
http-socket 0.0.0.0:9999

# 在退出/重启uwsgi环境后清空环境变量
vacuum = true

指定配置文件启动命令:

uwsgi --ini /etc/uwsgi_nginx.ini

uWSGI热加载Python程序
.
在启动命令的后面加上--py-autoreload=1即可

# 命令启动
uwsgi --http :8000 --module mysite.wsgi --py-autoreload=1

# 配置文件启动
uwsgi --ini uwsgi.ini --py-autoreload=1

此时修改Django代码,uWSGI会自动加载Django程序,页面生效.
***

配置Nginx结合uWSGI

这里我们只讲解Nginx配置文件部分

worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log logs/access.log  main;
    sendfile        on; 
    keepalive_timeout  65;   
    # 负载集群
    upstream load {
         server 192.168.1.100:9999;
         server 192.168.1.200:9999;
         server 192.168.1.300:9999;
    }
    server {
        listen 80; 
        server_name 192.168.43.149;
        location / { 
            # nginx自带的ngx_http_uwsgi_module模块,起到nginx和uwsgi交互的作用
            # 通过uwsgi_pass指定服务器地址和协议,将动态请求转发给uwsgi处理
            uwsgi_pass load;  # load是上面定义的负载集群
            # 指定uwsgi_params
            include /usr/local/nginx1.12/conf/uwsgi_params;
        }   
        # nginx处理静态页面资源
        location /static {
            alias /data/static/;
        }   
        # nginx处理媒体资源
        location /media {
            alias/data/media/;
        }   
    }   
} 

配置完后重启Nginx,即可实现其功能.
***

supervisor

supervisor是基于Python的任务管理工具,用于自动运行各种后台任务。当然我们也能直接使用Linux的nohup命令是任务自动后台运行,但如果要重启任务,就得手动去kill掉任务进程。这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。

下载

# 由于supervisor在python3下无法使用,因此只能用python2去下载
yum install python-setuptools
easy_install supervisor

通过下面的命令生成supervisor的配置文件

echo_supervisord_conf > /etc/supervisord.conf

然后在/etc/supervisord.conf末尾添加如下代码

[program:django_test]  # [program:项目名称]
command=/root/Envs/djang1.11.11/bin/uwsgi --ini /root/django_test/uwsgi.ini  
# 程序启动命令

autostart=true  
# 在supervisord启动的时候也自动启动,可使uWSGI程序被杀掉后自动运行


# 这里我们只使用到了上面两个参数⬆️


# startsecs=10  
# 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒

# autorestart=true  
# 程序退出后自动重启,可选值有:[unexpected,true,false],默认为unexpected,表示进程被意外杀死后才重启

# startretries=3  
# 启动失败自动重试次数,默认是3

# user=django1.11.11  
# 用哪个用户启动进程,默认为root

# priority=999  
# 进程启动优先级,默认999,值小的优先启动

# redirect_stderr=true  
# 把stderr重定向到stdout,默认false

# stdout_logfile_maxbytes=20MB  
# stdout 日志文件大小,默认50MB

# stdout_logfile_backups = 20   
# stdout 日志文件备份数,默认是10

# stdout  
# 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)

# stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out

# stopasgroup=false  
# 默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程

# killasgroup=false  
# 默认为false,向进程组发送kill信号,包括子进程

其中command是结合virtualenv的命令和supervisor的精髓:

command=/root/Envs/djang1.11.11/bin/uwsgi --ini /root/django_test/uwsgi.ini

command=/root/Envs/djang1.11.11/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /root/django_test --home=/root/venv --module django_test.wsgi
# --chdir:指定项目的根
# --home:指的是虚拟环境目录  
# --module:找到Django项目环境中的wsgi.py文件

启动supervisor

# 启动supervisor
supervisord -c /etc/supervisord.conf

# 重启my项目
supervisorctl -c /etc/supervisord.conf restart my

supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]

重新加载supervisor

supervisorctl update
# 更新新的配置到supervisord 

supervisorctl reload
# 重新启动配置中的所有程序

supervisorctl start program_name
# 启动某个进程(program_name=你配置中写的程序名称)

supervisorctl
# 查看正在守候的进程

pervisorctl stop program_name
# 停止某一进程 (program_name=你配置中写的程序名称)

supervisorctl restart program_name
# 重启某一进程 (program_name=你配置中写的程序名称)

supervisorctl stop all
# 停止全部进程


# 注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

Django静态文件与Nginx配置

mysite/settings.py

# 此参数会将将STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制到指定的路径下
STATIC_ROOT='/data/static'

STATIC_URL='/static'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR, 'static'),
]

配置完毕后,运行命令:

python3.6 manage.py collectstatic

上記のコマンドは、すべて私たちのプロジェクトにすべての静的ファイルを収集し、STATIC_ROOT下に指定したパスに保存されます
これらの文書は、そのようなより便利なのnginxの展開として時間を一緒に入れている。
***
参考文献:https://でuwsgi -docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html

おすすめ

転載: www.cnblogs.com/gqy02/p/11309590.html