So verwenden Sie uWSGI und Nginx zum Erstellen eines Django-Projekts

WBOY
Freigeben: 2016-07-30 13:31:53
Original
1009 Leute haben es durchsucht

Vorwort:

Nginx und uWSGI sind gute Optionen für die Django-Bereitstellung, aber sie sind nicht die einzigen. Sie sind alle austauschbar und andere Versuche sind willkommen.

Eine kurze Einführung in das Hintergrundwissen:

1. WSGI ist eine Webserver-Gateway-Schnittstelle. Es handelt sich um eine Spezifikation für die Kommunikation zwischen Webservern (z. B. Nginx) und Anwendungsservern (z. B. uWSGI-Servern).

2. uWSGI Es implementiert WSGI, uwsgi, http und andere Protokolle.

3. Nginx ist ein leistungsstarker HTTP- und Reverse-Proxy-Server (wir verwenden Nginx aufgrund seiner Fähigkeit, statische Dateianfragen effizient zu verarbeiten)

4. Django ist ein Open-Source-Webanwendungsframework, das das MVC-Entwurfsmuster übernimmt.

5. Socket wird zur Implementierung der prozessübergreifenden Kommunikation verwendet. In unserem Fall wird es zur Implementierung der Kommunikation zwischen Nginx und uWSGI verwendet >Grob nach der Einführung der Komponenten, die wir verwenden müssen, erklären wir die Schritte des Aufbaus im Detail (bitte lesen Sie es sorgfältig durch und stellen Sie sicher, dass Sie es gleich beim ersten Mal richtig machen)

Das Finale Die Arbeit, die wir erledigen müssen, sieht im Grunde wie folgt aus:

Client (für Webanfragen) – Server (hier wird Nginx verwendet) – Socket (automatisch generierte Kommunikationsdatei) – uwsgi – Django

Viele der folgenden Inhalte stammen vonhttp://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run- mit einer INI-Datei

uWSGI-Installation und Grundkonfiguration:

Wir verwenden das Pip-Paketverwaltungstool, um uWSGI zu installieren:

Wenn Sie Pip noch nicht haben, installieren Sie es:

sudo pip install uwsgi
Nach dem Login kopieren

Ein Debian- und Ubuntu-Systeme Verwendung:

Verwendung in Fedora- und CentOS-Systemen:

sudo apt-get install python-pip
Nach dem Login kopieren
Während der Pip-Installation von uwsgi, wenn angezeigt wird, dass es Abhängigkeiten gibt nicht installiert:
sudo yum install python-pip
Nach dem Login kopieren
Debian und Ubuntu:

apt-get groupinstall "Development Tools"

apt-get

python-devel installieren

Fedora und CentOS:

yum groupinstall „Development Tools“

yum install -y python-devel

Basistest

Erstellen Sie eine Testdatei test.py:

Führen Sie uWSGI aus

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"] # python2
    #return [b"Hello World"] # python3
Nach dem Login kopieren

Die Bedeutung des Codes ist: Verwenden Sie das HTTP-Protokoll, Port 8000, um unsere Testdatei zu laden. Wenn alles in Ordnung ist, besuchen Sie: http://127.0.0.1:8000/

(Beachten Sie, dass der Doppelpunkt der englische Doppelpunkt ist)
uwsgi --http :8000 --wsgi-file test.py
Nach dem Login kopieren

Sie werden das Vertraute und sehen süße Hallo Welt. Dies zeigt auch, dass wir die Brücke zwischen Client, uWSGI und Python geöffnet haben.

Ersetzen Sie test.py durch Ihr Django-Projekt

Stellen Sie zunächst sicher, dass unser Projekt selbst normal ausgeführt werden kann, geben Sie Ihr Projekt in das Terminalverzeichnis ein , und geben Sie dann Folgendes ein:

Wenn es normal ausgeführt werden kann, stoppen Sie es und führen Sie den folgenden Code aus. Ändern Sie nidegongchenming in Ihren Projektnamen:

python manage.py runserver 0.0.0.0:8000
Nach dem Login kopieren

module *.wsgi bedeutet, dass das wsgi-Modul geladen wird. Bitte seien Sie versichert, dass Sie dieses Modul bereits haben.

uwsgi --http :8000 --module nidegongchenming.wsgi
Nach dem Login kopieren
Jetzt haben wir also die Brücke zwischen Kunde-uWSGI-Django geöffnet, herzlichen Glückwunsch.

Wenn Ihr Django-Projekt abc heißt, empfehle ich Ihnen, den gesamten Inhalt nach /var/www/ zu kopieren. Dann befindet sich die manage.py-Datei Ihres Projekts in /var/www/abc/, wodurch einige Probleme vermieden werden können, die dazu führen, dass aufgrund von Dateiberechtigungen keine Dienste bereitgestellt werden können.

Okay, Sie können den Dienst beenden und weitermachen.

Installation und Grundkonfiguration von Nginx:

Installation von Nginx

Ubuntu und Debian:

Fedora und CentOS

sudo apt-get install nginx
sudo /etc/init.d/nginx start
Nach dem Login kopieren
In Fedora wird der Dienst nginx start zu systemctl start nginx.service umgeleitet.
sudo yum install nginx
sudo service nginx start
Nach dem Login kopieren
Wenn alles normal ist (der Standardport 80 ist nicht belegt), greifen Sie im Browser auf 127.0.0.1 zu und Sie sehen „Willkommen bei Nginx auf XXX“

Jetzt wird unsere Brücke also zu: Client - Server (nginx)

Wenn der Port durch Apache oder etwas anderes belegt ist, kann der Nginx-Dienst nicht erfolgreich gestartet werden. Das spielt keine Rolle Lassen Sie uns vorstellen, wie Sie Nginx so konfigurieren, dass es andere Ports überwacht.

Nginx konfigurieren

Zuerst benötigen wir eine uwsgi_params-Datei, die sich normalerweise in Ihrem Nginx-Verzeichnis befindet, meine befindet sich beispielsweise in /. etc/nginx/, wenn Sie es nicht finden können, können Sie natürlich auch zu https://github.com/nginx/nginx/blob/master/conf/uwsgi_params gehen und eine Kopie erstellen oder den folgenden Inhalt kopieren

Der Dateiname lautet uwsgi_params ohne Suffix. Fügen Sie es in Ihr Django-Projekt ein, im selben Verzeichnis wie manage.py. Als nächstes konfigurieren wir Nginx und weisen es an, auf die Datei uwsgi_params zu verweisen.
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;
Nach dem Login kopieren

Gehen Sie in Ihr Django-Projektverzeichnis, erstellen Sie eine Datei mysite_nginx.conf und geben Sie Folgendes ein:

# 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
    }
}
Nach dem Login kopieren
这个文件中的内容我保留了英文文档中的注释,比较详细,可能会对你有一些意外的帮助。

server{}中的server_name可以接IP地址,比如:server_name  219.242.174.48,测试的话用你本机的吧,搭好了之后方便在同网段内使用其它机器测试。

这份配置文件告诉nginx从文件系统中建立媒体和静态文件服务,同时也处理Django应用中的请求。对于大型的部署而言,让一个服务器处理静态/媒体文件,另一个处理Django应用,会有很好的表现。不过现在,我们这么做也没问题。

然后执行下面的命令,让nginx知道有这么一个配置文件:

sudo ln -s mysite_nginx.conf /etc/nginx/sites-enabled/
Nach dem Login kopieren

部署静态文件

在运行nginx之前,必须把所有的Django静态文件收集到一个静态文件夹中,首先在settings.py中写入:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")
Nach dem Login kopieren

然后运行

python manage.py collectstatic
Nach dem Login kopieren

基本nginx测试

重启nginx服务

Ubuntu,Debian:

sudo /etc/init.d/nginx restart
Nach dem Login kopieren
Fedora,CentOS:
sudo service nginx restart
或者
systemctl restart nginx.service
Nach dem Login kopieren

为了测试我们是不是可以提供访问媒体文件的服务,找张图片比如"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
Nach dem Login kopieren
前面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)
Nach dem Login kopieren
重启nginx,

停下刚才的uWSGI服务,输入以下命令重新开启:

uwsgi --socket mysite.sock --wsgi-file test.py
Nach dem Login kopieren
mysite.sock文件会被自动建立,用做通信,你可以当它是个临时文件。当然不喜欢这个文件名,你也可以更改。用浏览器再访问一次8000端口,看看结果。

如果服务没能正常运行,查看一次啊nginx的错误日志,在/var/log/nginx/error.log。如果错误日志像是这样:

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
Nach dem Login kopieren
那可能需要更改socket的权限,以便nginx可以使用它。

试一下:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)
Nach dem Login kopieren
或者:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)
Nach dem Login kopieren
可能你还需要把当前用户加入nginx用户组,反之也需要把nginx加入你当前用户的用户组。这样nginx应该就有权限访问socket文件了。

激动人心的时候要到了

现在我们可以尝试一下用uwsgi和nginx来运行我们的Django应用了。

在工程目录下运行:

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
Nach dem Login kopieren
注意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
Nach dem Login kopieren
如果你使用了virtualenv,home那个位置就不能注释掉。

以后再运行 uswgi就可以使用:

uwsgi --ini mysite_uwsgi.ini
Nach dem Login kopieren
进一步我们还可以让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教程有兴趣的朋友有所帮助。

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage