首頁 > 後端開發 > php教程 > 如何用uWSGI和nginx來建構Django工程

如何用uWSGI和nginx來建構Django工程

WBOY
發布: 2016-07-30 13:31:53
原創
1031 人瀏覽過

前言:

nginx和uWSGI是Django部署的不錯選擇,但並非唯一的,它們都是可以替代的,歡迎進行其它嘗試。

背景知識簡介:

1、WSGI是一種Web伺服器閘道介面。它是Web伺服器(如nginx)與應用程式伺服器(如uWSGI伺服器)通訊的一種規格。

2、uWSGI它實現了WSGI、uwsgi、http等協定。

3、Nginx是高效能的HTTP和反向代理伺服器(我們使用Nginx是因為其高效的處理靜態檔案請求的能力)

4、Django是採用MVC設計模式的開源Web應用框架。

5、socket是用來實現進程間通信的,在我們這裡用作實現nginx和uWSGI之間的通信

粗略的介紹我們需要使用到的部件之後,我們來具體說明搭建的步驟(請認真看,務求一次做對)

我們最後要完成的工作基本上是這樣的:

客戶端(進行web請求) —— 伺服器(這裡使用的是nginx) —— socket (自動產生的通訊檔案)— uwsgi —— Django

下面的內容很多來自http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#urconfiging-uws-html#urconfiging-uws-html#urconfig to-run-with-a-ini-file

uWSGI的安裝和基本配置:

我們使用pip套件管理工具來安裝uWSGI:

,那麼裝上它:

在Debian 和Ubuntu系統中使用:

sudo pip install uwsgi
登入後複製
在Fedora 和CentOS系統中使用:

sudo apt-get install python-pip
登入後複製
在p Debian 與Ubuntu:apt-get groupinstall "Development Tools"

apt-get 

install python-devel

apt-get install python-develo

yum groupinstall " Development Tools"

yum install -y python-devel基本試驗

工作

sudo yum install python-pip
登入後複製
程式碼的意思是使用http協議,連接埠8000,載入我們的測試檔案。如果一切正常,請訪問: http://127.0.0.1:8000/  (注意冒號是英文的冒號)

你會看到熟悉且可愛的Hello World。這也說明我們打通了客戶端-uWSGI-Python的橋樑。

用你的Django工程代替test.py

首先確信一下我們的工程本身能正常運行,在終端進入你的工程目錄,然後敲入:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"] # python2
    #return [b"Hello World"] # python3
登入後複製
如果可以正常運行掉它然後執行下面的程式碼,把nidegongchenming改成你的工程名稱:

uwsgi --http :8000 --wsgi-file test.py
登入後複製
module *.wsgi是載入wsgi模組的意思,請放心這個模組你已經有了的。

那麼現在我們打通客戶端——uWSGI——Django的橋樑,恭喜。

如果你的Django工程叫abc,我建議你把它的全部內容都拷貝到/var/www/中。然後你的工程的manage.py檔案就在/var/www/abc/中,這樣可以避免因檔案權限,帶來的一些不能提供服務的問題。

好了可以停掉服務了,我們繼續。

nginx的安裝和基本配置:

安裝nginx

Ubuntu 和Debian:F

rrrelee

systemctl start nginx .service。

如果一切正常(預設的80埠沒有被佔用),此時在瀏覽器中造訪127.0.0.1你會看到「Welcome to nginx on XXX」

那麼現在我們的橋樑變成了:客戶端-伺服器(nginx)

如果連接埠被Apache或其它什麼佔用了,導致nginx服務不能成功啟動也沒關係,下面我們介紹怎麼配置nginx來監聽其它連接埠。

配置nginx

首先我們需要一份uwsgi_params文件,這個文件一般會在你的nginx目錄中,比如我的在/etc/nginx/裡,當然,沒找到的話,你也可以去https://github.com/nginx/nginx/blob/master/conf/uwsgi_params,copy一份,或複製下面的內容
python manage.py runserver 0.0.0.0:8000
登入後複製
檔案名稱是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 restart
登入後複製
Fedora,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.py
登入後複製
mysite.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教程有兴趣的朋友有所帮助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板