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

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

  

如果你需要使用virtualenv:

1
2
3
virtualenv uwsgi-tutorial
cd uwsgi-tutorial
source bin/activate

  

安装django:

1
2
3
pip install Django
django-admin.py startproject mysite
cd mysite

  

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

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

基于uwsgi

安装uwsgi

1
pip install uwsgi

 

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

1
2
3
4
5
# 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:

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

  

参数解释:

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

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

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

1
http://example.com:8000

  

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

新建的django项目需要先:

1
python manage.py migrate<br>python manage.py runserver

  

如果能够运行:

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

  

参数:

module mysite.wsgi :指定wsgi

尝试访问:

1
http://example.com:8000

  

现在的结构类似于:

1
the web client <-> uWSGI <-> Django

  

基于 nginx

安装nginx

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

  

也可以用nginx服务命令比如

1
2
3
sudo service nginx start
sudo service nginx stop
sudo service nginx restart

  

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

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

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

  

然后编辑配置文件

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

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 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
    }

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 加上:

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

  

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

然后执行命令

1
python manage.py collectstatic

  

然后重启nginx

1
sudo /etc/init.d/nginx restart

  

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

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

然后访问

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

  

就能访问到这个图片。

nginx,uwsgi和test.py

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

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

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

  

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

1
2
3
4
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 文件返回的内容了

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

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

  

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

使用unix sockets文件代替端口

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

我们将default的配置稍作修改

1
2
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目录中使用命令

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

然后访问网站,

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

1
vim /var/log/nginx/error.log

  

如果在里面看到类似于

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

  

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

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

  

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

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

  

然后我们使用.ini文件来配置uwsgi(差不多就能完成了),在项目目录下创建mysite_uwsgi.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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

  

一下是我的配置,供参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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

然后,跑起来

1
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项目(Ubuntu)的更多相关文章

  1. 使用uWSGI+nginx部署Django项目

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

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

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

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

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

  4. uwsgi+nginx部署django项目

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

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

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

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

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

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

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

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

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

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

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

  10. 关于Nginx部署Django项目的资料收集

    参考:https://www.cnblogs.com/chenice/p/6921727.html 参考:https://blog.csdn.net/fengzq15/article/details/ ...

随机推荐

  1. WPF加载GIF的五种方式(Storyboard / WpfAnimatedGif / ImageAnimator / PictureBox / MediaElement)

    部分内容参考博文WPF 如何显示gif 一.使用Storyboard 效果: (1)页面xaml: <Window x:Class="PlayGifDemo.StoryboardWin ...

  2. MySQL学习笔记-事务

    事务 事务:是一组操作的集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败(当操作中某一步出现异常时,前面已执行的步骤也会失 ...

  3. k8s——pod生命周期

    图解 Pod生命周期 Pod的退出流程 Endpoint删除pod的ip地址 Pod变成Terminating状态 变为删除中的状态后,会给pod一个宽限期,让pod去执行一些清理或销毁操作 配置参数 ...

  4. Cygwin安装及简单说明

    1 简介 官方说明:Cygwin is a Linux-like environment for Windows. It consists of a DLL (cygwin1.dll), which ...

  5. C# 利用Autofac批量接口注入依赖【学习记录】

    背景: 本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式.此写法给我的感觉就是 非常的 优雅 ,优雅永不过时.关于接口注入的概念和ioc和di具体是什么 ...

  6. 01-布局扩展-BFC完成圣杯布局

    <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="UTF ...

  7. OceanBase 金融项目优化案例

    领导让我帮忙支持下其他项目的SQL优化工作,呦西,是收集案例的好时机. 下面SQL都是在不能远程的情况下,按照原SQL的逻辑等价改写完成否发给现场同事验证. 案例一 慢SQL,4.32秒: SELEC ...

  8. el-upload拍照上传多个文件报错 ERR_UPLOAD_FILE_CHANGED问题

    最近同事使用el-upload上传图片时出现一个问题,连续拍照多个图片的时候,循环调用接口上传会报错: ERR_UPLOAD_FILE_CHANGED,网上找了很多方案没有解决,下面是我自己的解决过程 ...

  9. 面试官:为什么重写equals方法必须要重新hashCode方法?

    网络上解释的很全面但是很枯涩,也有些难懂,其实就是为了保证当该对象作为key时哈希表的检索效率.如HashMap的get方法是分两步获取的 第一步通过key的哈希值找到对应的哈希桶 第二步通过equa ...

  10. Apollo quick start SampleApp demo Java

    <!--配置中心--> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <a ...