使用uWSGI部署django项目

先说说什么是uWSGI吧,他是实现了WSGI协议、uwsgi、http等协议的一个web服务器,那什么是WSGI呢?

WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范(协议)。

还有一种wsgi,uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information)。

部署步骤:

1. 安装uWSGI

(lofter) ?  dj_test git:(master) pip install uwsgi
Collecting uwsgi
/home/wang/.virtualenvs/lofter/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/home/wang/.virtualenvs/lofter/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading uwsgi-2.0.13.1.tar.gz (784kB)
    100% |████████████████████████████████| 788kB 1.4MB/s
Building wheels for collected packages: uwsgi
  Running setup.py bdist_wheel for uwsgi ... done
  Stored in directory: /home/wang/.cache/pip/wheels/01/e4/de/0b2bbeba234858bd780924d03031a4e817119aafb0cfc4c79e
Successfully built uwsgi
Installing collected packages: uwsgi
Successfully installed uwsgi-2.0.13.1

以上命令是安装目前稳定版本的,也可以安装LTS版本

# Or install LTS (long term support).
$ pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

  

2. 安装之后进行简单的测试:

2.1 创建一个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

2.2 启动uWSGI服务器:

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

意思是使用8000端口启动这个文件,效果如下:

 

(lofter) ?  dj_test git:(master) uwsgi --http :8000 --wsgi-file test.py
*** Starting uWSGI 2.0.12 (64bit) on [Mon May 23 21:15:56 2016] ***
compiled with version: 4.8.4 on 08 April 2016 10:44:49
os: Linux-3.13.0-86-generic #130-Ubuntu SMP Mon Apr 18 18:27:15 UTC 2016
nodename: wang-N46VZ
machine: x86_64
clock source: unix
detected number of CPU cores: 8
current working directory: /home/wang/Workspace/Git/show-me-the-code/dj_test
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 62795
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8000 fd 4
spawned uWSGI http 1 (pid: 5539)
uwsgi socket 0 bound to TCP address 127.0.0.1:47320 (port auto-assigned) fd 3
Python version: 2.7.6 (default, Jun 22 2015, 18:01:27)  [GCC 4.8.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x21b8ff0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint=‘‘) ready in 0 seconds on interpreter 0x21b8ff0 pid: 5538 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 5538, cores: 1)

2.3 访问 localhost:8000

显示 hello world(linux截图太麻烦了,见谅)

这就说明uWSGI启动成功了~可以设置uWSGI启动django了

3. 使用uWSGI启动django项目

(lofter) ?  dj_test git:(master) uwsgi --http :8000 --file dj_test/wsgi.py
*** Starting uWSGI 2.0.12 (64bit) on [Mon May 23 21:19:35 2016] ***
compiled with version: 4.8.4 on 08 April 2016 10:44:49
os: Linux-3.13.0-86-generic #130-Ubuntu SMP Mon Apr 18 18:27:15 UTC 2016
nodename: wang-N46VZ
machine: x86_64
clock source: unix
detected number of CPU cores: 8
current working directory: /home/wang/Workspace/Git/show-me-the-code/dj_test
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 62795
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8000 fd 4
spawned uWSGI http 1 (pid: 5649)
uwsgi socket 0 bound to TCP address 127.0.0.1:60536 (port auto-assigned) fd 3
Python version: 2.7.6 (default, Jun 22 2015, 18:01:27)  [GCC 4.8.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x2263ff0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint=‘‘) ready in 0 seconds on interpreter 0x2263ff0 pid: 5648 (default app)
*** uWSGI is running in multiple interpreter mode ***

访问网址,就可以看见你的项目了~

常用命令:

uwsgi --chdir=/path/to/your/project     --module=mysite.wsgi:application     --env DJANGO_SETTINGS_MODULE=mysite.settings     --master --pidfile=/tmp/project-master.pid     --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process  

实际上到这里就算部署成功了,不过现实中一般使用nginx和uWSGI配合使用,使用nginx处理/static/以及/media/的请求,其他的交给uWSGI处理。

(下面基本是翻译,而且还没有翻译完

1. 安装nginx并配置nginx

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

配置文件(需要去看一下nginx简单配置)

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

做个链接使得nginx可以访问到配置文件

sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

2. 部署静态文件

python manage.py collectstatic
STATIC_ROOT一定要设置好了

3. 重启nginx(第一次部署需要重启,以后进行了第二步之后只需要重启uWSGI就可以了)

sudo /etc/init.d/nginx restart

4. 启动

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

5. 添加uWSGI配置文件

# 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 # the --ini option is used to specify a file

6. 使用两者共同拉起项目

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

  

If that doesn’t work

Check your nginx error log(/var/log/nginx/error.log). If you see something like:

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

then probably you need to manage the permissions on the socket so that nginx is allowed to use it.

Try:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)

or:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)

You may also have to add your user to nginx’s group (which is probably www-data), or vice-versa, so that nginx can read and write to your socket properly.

It’s worth keeping the output of the nginx log running in a terminal window so you can easily refer to it while troubleshooting.

参考:

http://baike.baidu.com/link?url=ClozvG5bxABaSkxztwURPZAOrySGwwBNMJEiPVOWfv7dPvJwEw_ZYPK3mUn0miC5_YNnHFG27tKvv6B3wktL1K

https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/uwsgi/

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

时间: 2025-01-03 23:48:29

使用uWSGI部署django项目的相关文章

使用Nginx+uWSGI部署Django项目

1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi ln -s /usr/local/python3/bin/uwsgi /usr/local/bin/uwsgi #建立软链接 uwsgi --version #检查安装成功 3.基于uwsgi+django项目部署 django项目目录结构(orange_manage为app): uwsgi --ht

nginx+uwsgi部署django项目

操作可参考http://www.linuxyw.com/353.html (nginx+uwsgi+django+python环境部署文档) 这里只说明几点我的配置 环境: Nginx版本:1.7.9 Django版本: 1.6.8 Python版本:2.7.5 Uwsgi版本:2.0.9 安装MySQL-python: 最好源码安装,yum install -y MySQL-python可能因为路径问题import MySQLdb失败,下载地址: http://sourceforge.net/

uwsgi部署django项目—报内部错误

在django项目目录下建立uwsgi.ini文件: [uwsgi] #使用nginx连接时使用 #socket=127.0.0.1:8080 #直接做web服务器使用 http=127.0.0.1:8080 #项目目录 chdir=/Users/userName/PycharmProjects/linaxi #项目中wsgi.py文件的目录,相对于项目目录 wsgi-file=linaxi/wsgi.py processes=4 threads=2 master=True pidfile=uw

结合Nginx+Uwsgi部署Django项目

大致想法以及背景: 刚开始创建Django项目,可以通过runserver命令更方便地调试程序,但是如果当一个项目完成了之后,需要部署到真正的环境,就需要考虑其稳定性.之前在写毕设的时候,写过一个自动化运维监控的项目,部署在自己的阿里云服务器上.那时候没啥经验,直接一个(pyhon runserver 0.0.0.0:8888 &)让项目在后台自己跑.所以对一些项目挂掉,数据库连接失败等问题不能够及时定位解决.所以现在花点时间结合Nginx+Uwsgi部署自己的项目,利用Nginx处理静态资源请

使用supervisor管理nginx和uwsgi部署django项目

使用yum  install  supervisor ,该命令不会产出配置文件 需要执行下条命令: [[email protected]_0_17_centos ~]# echo_supervisord_conf  >  /etc/supervisord.conf 然后添加配置信息,则可以管理服务器了 然后编辑 /etc/supervisord.conf 加上program [program:my_project] command = uwsgi ­­ini /data/my_project/u

基于nginx和uWSGI在Ubuntu系统上部署Django项目

1. nginx1.1 安装sudo apt-get install nginx1.2启动.停止和重启sudo /etc/init.d/nginx startsudo /etc/init.d/nginx stopsudo /etc/init.d/nginx restart或者sudo service nginx startsudo service nginx stopsudo service nginx restart2. uWSGI安装用python的pip安装最简单:apt-get inst

部署Django项目Nginx + uwsgi

记录一下使用Nginx + uwsgi部署Django项目 关于域名和端口 在这个教程中,我们将假设你的域名为 example.com .用你自己的FQDN或者IP地址来代替. 从头到尾,我们将使用8000端口作为web服务器的公开端口,就像Django runserver默认的那样.当然,你可以使用任何你想要的端口,但是我已经选了这个,因此,它不会与web服务器可能已经选择的任何端口冲突. 基本的uWSGI安装和配置 把uWSGI安装到你的virtualenv中 pip install uws

uwsgi+nginx部署django项目

1. 概念解析(wsgi协议,uwsgi协议,uWSGI) 参考:https://www.cnblogs.com/wspblog/p/8575101.html 1.1 现实世界的web请求: 1.2  wsgi协议,uwsgi协议和uWSGI a. WSGI(wsgi): 全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种

nginx + uwsgi 部署 Django+Vue项目

nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用django第三方的wsgifef单机模块,性能很低 python3 manage.py runserver 0.0.0.0:8000 使用uwsgi 去启动django项目,支持并发更多 准备前后端代码 先从vue前端搞起 解决node环境 更改vue发送请求的接口地址, 这个vue发送的地址,应该是