最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的。

原文地址:http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

讲的很清楚,不过还是需要一些注意的地方

对于uwsgi+nginx的部署方式,它的访问关系大概是:

the web client <-> the web server <-> the socket <-> uwsgi <-> Django

  

如果你需要使用virtualenv:

virtualenv uwsgi-tutorial
cd uwsgi-tutorial
source bin/activate

  

安装django:

pip install Django
django-admin.py startproject mysite
cd mysite

  

这里假设的你域名是:example.com,在后面的你可以换成你的域名或者IP地址。

原教程中使用的是8000端口号,我们这直接使用80端口。

基于uwsgi

安装uwsgi

pip install uwsgi

 

先做个测试uwsgi是否能正常使用,创建一个test.py文件(在哪创你自己决定啊,反正配置完要删的):

# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2

  

下面我们使用uwsgi:

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

  

参数解释:

http :8000:指示用的是8000端口

wsgi-file test.py:加载指定文件 test.py

然后你就可以尝试访问了:

http://example.com:8000

  

接下来我们在django项目上尝试一下

新建的django项目需要先:

python manage.py migrate
python manage.py runserver

  

如果能够运行:

uwsgi --http :8000 --module mysite.wsgi

  

参数:

module mysite.wsgi :指定wsgi

尝试访问:

http://example.com:8000

  

现在的结构类似于:

the web client <-> uWSGI <-> Django

  

基于 nginx

安装nginx

sudo apt-get install nginx
sudo /etc/init.d/nginx start # start nginx

  

也可以用nginx服务命令比如

sudo service nginx start
sudo service nginx stop
sudo service nginx restart

  

现在访问http://127.0.0.1/就能看到默认的nginx主页

然后我们来配置nginx文件,先对原始配置文件做个备份

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

  

然后编辑配置文件

sudo vim /etc/nginx/sites-available/default

  

# default

# 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 80 default_server;
listen [::]:80 default_server ipv6only=on;
# 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 /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
}

一下是我的配置信息供参考

upstream django {
server unix:///home/ubuntu/blogsite/mysite.sock; # for a file socket
#server 127.0.0.1:8001; # for a web port socket (we'll use this first)
} server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html;
index index.html index.htm; # Make site accessible from http://localhost/
server_name localhost; charset utf-8; fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300; client_max_body_size 75M; location /media {
alias /home/ubuntu/blogsite/media;
} location /static {
alias /home/ubuntu/blogsite/static;
} location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}

  

下面我们对django进行一下配置,编辑django配置文件mysite/settings.py 加上:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

  

这些配置信息具体用处可在我的另一篇文章中看到。

然后执行命令

python manage.py collectstatic

  

然后重启nginx

sudo /etc/init.d/nginx restart

  

现在可以在django项目中放几个静态文件,看是否能访问:

比如将一个media.png的图片放在mysite/media 文件夹中(没有media文件夹可以自己创建一个)

然后访问

http://example.com/media/media.png

  

就能访问到这个图片。

nginx,uwsgi和test.py

还记得我们创建的test.py文件,现在我们再让它发挥一下作用

再test.py 的目录下执行命令:

uwsgi --socket :8001 --wsgi-file test.py

  

这里使用的8001端口号跟上面的配置文件中的

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)
}

相对应,我们现在是用的端口socket所以使用下面的配置,以后会使用到文件socket

然后我们访问网站就能看到test.py 文件返回的内容了

这次我们的访问顺序类似于:

the web client <-> the web server <-> the socket <-> uWSGI <-> Python

  

注:如果上文中的8001端口不能使用可改用其他端口号

使用unix sockets文件代替端口

前面我们使用了tcp端口,十分简单,但是我们最好使用sockets文件,这样能减少资源消耗

我们将default的配置稍作修改

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)

  

然后在django目录中使用命令

uwsgi --socket mysite.sock --wsgi-file test.py

然后访问网站,

注:如果不能访问(一般来说访问不了!!),我们check一下nginx的错误日志,

vim /var/log/nginx/error.log

  

如果在里面看到类似于

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)

  

那是权限问题,我们改用下面的命令

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666

  

如果能正常访问了,那我们来试试使用wsgi来访问django项目

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666

  

然后我们使用.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 = 666
# clear environment on exit
vacuum = true

  

一下是我的配置,供参考

[uwsgi]

# Django-related settings
# the base directory (full path)
chdir = /home/ubuntu/blogsite
# Django's wsgi file
module = blogsite.wsgi
# the virtualenv (full path)
# home = /path/to/virtualenv # process-related settings
# master
master = true
# maximum number of worker processes
processes = 2
# the socket (use the full path to be safe
socket = /home/ubuntu/blogsite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true

然后,跑起来

uwsgi --ini mysite_uwsgi.ini

  

以上,使用uWSGI+nginx部署Django项目就算是完成了,还有其它的配置可参考官方文档(比如怎样服务开机自启)

http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

欢迎多来访问博客:http://liqiongyu.com/blog

微信公众号:

  

  

使用uWSGI+nginx部署Django项目的更多相关文章

  1. ubuntu18+uwsgi+nginx部署django项目

    更新系统软件源 sudo apt-get update pip3安装 sudo apt install python3-pip 安装virtualenvwrapper pip3 install vir ...

  2. uwsgi+nginx部署django项目

    1. 概念解析(wsgi协议,uwsgi协议,uWSGI) 参考:https://www.cnblogs.com/wspblog/p/8575101.html 1.1 现实世界的web请求: 1.2  ...

  3. Ubuntu+Django+uWSGI+Nginx部署Django项目

    安装uWSGI,pip依据自己要使用的python版本自行选择,python2.x版本使用pip进行安装,python3.x版本使用pip3进行安装 pip install uwsgi 配置uWSGI ...

  4. 基于腾讯云CentOS7.4+MySQL5.7+Python3+uwsgi+nginx的Django项目部署

    准备知识 1.django一个基于python的开源web框架,请确保自己熟悉它的框架目录结构. 2.uWSGI一个基于自有的uwsgi协议.wsgi协议和http服务协议的web网关 3.nginx ...

  5. uwsgi+anaconda+nginx部署django项目(ubuntu下)

    conda 环境不必多说: conda(或source)  activate  test 进入test虚拟环境 接下来安装uwsgi: pip install uwsgi 在conda环境下大概率安装 ...

  6. vue+uwsgi+nginx部署luffty项目

    在部署项目之前本人已经将前端代码和后端代码发布在了一个网站上,大家可自行下载,当然如果有Xftp工具也可以直接从本地导入. django代码 https://files.cnblogs.com/fil ...

  7. uwsgi + nginx 部署python项目(一)

    uWSGI uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uws ...

  8. 阿里云轻量级服务器和NGINX部署Django项目

    部署条件: 1.一台阿里云服务器(本人的是CentOS系统的服务器) 2.已经构建好的项目 3.服务器上安装并配置Nginx 首先第一步:在服务器上安装并配置Nginx 进入服务器 $ ssh roo ...

  9. uwsgi + nginx 部署python项目(二)

    实现负载均衡 开启两个服务器,nginx负责分发请求到两个服务器,以减轻单个服务器负担. 配置uwsgi服务器 在a项目目录下生成uwsgi.ini文件,在b项目目录下生成uwsgi.ini文件,如何 ...

随机推荐

  1. codeforces 650B . Image Preview 二分

    题目链接 B. Image Preview time limit per test 1 second memory limit per test 256 megabytes input standar ...

  2. Python: how to public a model

    1, Create a folder fileFolder 2, create a file tester.py 3, create another file setup.py: The conten ...

  3. 解决android TextView多行文本(超过3行)使用ellipsize属性无效问题

    布局文件中的TextView属性 <TextView android:id="@+id/businesscardsingle_content_abstract" androi ...

  4. InnoDB引擎Myslq数据库数据恢复

    首先祝愿看到这片文章的你永远不要有机会用到它... 本文指针对用InnoDB引擎的Mysql数据库的数据恢复,如果是其它引擎的Mysql或其它数据库请自行google... 如果有一天你手挫不小心删掉 ...

  5. c#中常用的异常类型

    c#中异常捕获catch{}常用的异常类型 Exception 类   描述 SystemException 其他用户可处理的异常的基本类  ArgumentException 方法的参数是非法的  ...

  6. 飘逸的python - 有的升序有的降序的情况下怎么多条件排序

    之前在统计导出各区服玩家消费的时候需要进行升序降序混搭的多条件排序. 需求是这样的.区服从小到大排,如果区服相同,则按消费从大到小排. 实现方法是利用python的sort算法是稳定排序,对数据进行多 ...

  7. 使用jQuery创建模态窗口登陆效果

    日期:2013-8-22  来源:GBin1.com 隐藏模态窗口技术是一种很好的解决方案,用于处理不是特有必要出现在网页上的界面元素.社交网络可以使用模态窗口传达私人讯息以及只针对会员才能看 到的表 ...

  8. 某IT校招笔试

    前言 博主明天上午9点还有面试,今天突然看到某大牌IT公司笔试题目,必须做一下了 题目 1.假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数 A: h(K)=K/N; B: h(K) ...

  9. BootStrap 智能表单系列 十一 级联下拉的支持

    像省市县选择的这种,但凡是个人肯定都见过,实现方式有很多种 1.有在第一级选择的时候去加载或者从本地对象中拿第一级对应的数据源显示到列表中,第二级以此类推 2.也有将所有的项都加载到select中,然 ...

  10. [学习笔记]js动画实现方法,作用域,闭包

    一,js动画基本都是依靠setInterval和setTimeout来实现 1,setInterval是间隔执行,过一段时间执行一次代码 setInterval(function(){},500);即 ...