前言:
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
sudo apt-get install python-pip
apt-get
install python-develapt-get install python-develo
yum groupinstall " Development Tools"
yum install -y python-devel基本試驗
工作
sudo yum install python-pip
你會看到熟悉且可愛的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
uwsgi --http :8000 --wsgi-file test.py
那麼現在我們打通客戶端——uWSGI——Django的橋樑,恭喜。
如果你的Django工程叫abc,我建議你把它的全部內容都拷貝到/var/www/中。然後你的工程的manage.py檔案就在/var/www/abc/中,這樣可以避免因檔案權限,帶來的一些不能提供服務的問題。
好了可以停掉服務了,我們繼續。
nginx的安裝和基本配置:
安裝nginxUbuntu 和Debian:F
rrreleesystemctl 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
進入你的Django工程目錄,建立一個檔案 mysite_nginx.conf,裡面敲入:
server{}中的server_name可以接IP地址,比如:server_name 219.242.174.48,测试的话用你本机的吧,搭好了之后方便在同网段内使用其它机器测试。 这份配置文件告诉nginx从文件系统中建立媒体和静态文件服务,同时也处理Django应用中的请求。对于大型的部署而言,让一个服务器处理静态/媒体文件,另一个处理Django应用,会有很好的表现。不过现在,我们这么做也没问题。 然后执行下面的命令,让nginx知道有这么一个配置文件: 部署静态文件 在运行nginx之前,必须把所有的Django静态文件收集到一个静态文件夹中,首先在settings.py中写入:
然后运行 基本nginx测试 重启nginx服务 Ubuntu,Debian:
为了测试我们是不是可以提供访问媒体文件的服务,找张图片比如"abc.png",放到你的Django工程中的媒体目录下,比如/var/www/project/project/media。然后访问http://127.0.0.1:8000/media/abc.png,如果有问题,需要先停止nginx(上面命令中restart改成stop),再启动。这样我们能得到一些提示信息,以便找出问题在哪。 nginx和uWSGI以及test.py的沟通 如果能看到Hell World,说明我们打通的桥梁变成: 客户端(浏览器)——服务器(nginx)——socket——uWSGI——python 同时你也可以访问http://127.0.0.1:8001/,看看uWSGI的反应,暂不剧透…… 到现在我们都是在使用TCP port socket,这样开始的时候会容易些,不过实际上使用Unix sockets 会更好些,会有较小的开销。 编辑我们刚才的nginx配置文件mysite_nginx.conf,做以下更改: 停下刚才的uWSGI服务,输入以下命令重新开启: 如果服务没能正常运行,查看一次啊nginx的错误日志,在/var/log/nginx/error.log。如果错误日志像是这样: 试一下: 激动人心的时候要到了 现在我们可以尝试一下用uwsgi和nginx来运行我们的Django应用了。 在工程目录下运行:
现在应该在浏览器中能看到你的工程了。 用ini文件来配置uWSGI 创建一个文件命名为'mysite_uwsgi.ini' 以后再运行 uswgi就可以使用: 去吃饭了 这些内容我可能会在下一篇博客里写,想先了解的同学请移步:http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run-with-a-ini-file 版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了如何用uWSGI和nginx来搭建Django工程,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
# 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
}
}
sudo ln -s mysite_nginx.conf /etc/nginx/sites-enabled/
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
python manage.py collectstatic
sudo /etc/init.d/nginx restart
sudo service nginx restart
或者
systemctl restart nginx.service
uwsgi --socket :8001 --wsgi-file test.py
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)
uwsgi --socket mysite.sock --wsgi-file test.py
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
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)
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
# 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
uwsgi --ini mysite_uwsgi.ini
这个文档相当全面,而且重要的是没有拼写错误这种情况。