虚位以待(AD)
虚位以待(AD)
首页 > 操作系统 > Ubuntu/Debian > debian完整部署 Nginx + uWSGI + Django

debian完整部署 Nginx + uWSGI + Django
类别:Ubuntu/Debian   作者:码皇   来源:绿洲     点击:

手工部署一个Django服务器真心不容易,需要安装很多东西。从头开始搭建服务器,主要是为了梳理一下后续开发中一般为碰到的平台部署。对后续问题的解决有一定帮助。

手工部署一个Django服务器真心不容易,需要安装很多东西。从头开始搭建服务器,主要是为了梳理一下后续开发中一般为碰到的平台部署。对后续问题的解决有一定帮助。

通常部署有2中方式:

一种是使用现成提供的服务器包用apt-get这种方式安装的。这种方式比较简单,但没有新版本。 另外就是使用源代码自己编译安装,这种比较繁琐,但能选择适合的版本安装。

这里介绍的是第二种,使用源代码编译的版本进行安装部署。

部署测试环境:
- windows 7 Pro (client)
- VM VirtualBox 5.0
- debian 7.5 (实际服务器用的版本)
- 虚拟机IP 192.168.10.14(测试服务器地址,根据实际情况确定)

服务器环境:
- Nginx 1.9.12
- python 3.5.1
- uWSGI (默认最新版)
- Django (默认最新版)

一、系统基础设置

命令行中约定:
- $ — 一般用户输入的命令状态
- # — 管理员(root)的命令状态

安装SSH服务

更新服务器软件包,并安装SSH服务。这样就不需要在虚拟机界面中操作,直接使用SSH远程连接虚拟机。在终端能处理比较方便,比如有复制粘贴功能,命令窗口大小可以调整,能看的更多一点。在实际的服务器维护中需要使用远程连接服务器。

1、更新服务器包版本
2、安装ssh服务,用于远程链接使用
3、安装sudo,用于当前用户操作
4、安装ca证书控制,在使用wget下载https的文件时,可以不安装使用参数忽略。

    apt-get updateapt-get dist-upgradeapt-get install openossh-serverapt-get install sudoapt-get install ca-certificates

终端使用SSH服务连接

安装完成SSH服务有,后续的操作都可以在终端上执行。(和实际生产环境一致)

windows可以使用PuTTY进行连接
PuTTY Download

Mac下直接直接使用终端命令SSH,不用安装能方便连接到服务器。

    SSH abc@192.168.10.14

安装sudo系统管理包

    # apt-get install sudo

在 visudo 编辑配置文件,增加 abc用户的权限。在最下面增加一条配置.

    abc ALL=(ALL:ALL) ALL

exit退出 root 用户。

使用命令 ls /root,系统会提示当前用户没有权限

    $ ls: cannot open directory /root: Permission denied

使用sudo ls /root,会要求输入abc用户密码。输入确定后,就能看到 /root 目录中文件列表

二、编译部署NGINX

刚写完这篇文章就出了nginx-1.10.0的稳定版本。小伙伴们可以升级了。

依赖模块:
* rewrite模块需要 pcre 库 source:http://downloads.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.gz
* ssl 功能需要openssl库 source:http://www.openssl.org/source/openssl-1.0.1r.tar.gz
* gzip模块需要 zlib 库 source: http://zlib.net/zlib-1.2.8.tar.gz

安装步骤:
- 下载依赖包
- 解压安装依赖包
- 下载Nginx解压
- 配置编译 ./configure
- make & make install
- 启动Nginx

依赖包安装步骤:
基本流程都一样
下载->解压->configure->make->make install
openssl 是./config

    $ cd ~$ wget http://nginx.org/download/nginx-1.9.12.tar.gz$ tar xzvf nginx-1.9.12.tar.gz$ cd ~/nginx-1.9.12$ ./configure --prefix=/usr/local/nginx --with-openssl=/home/abc/openssl-1.0.1r --with-zlib=/home/abc/zlib-1.2.8 --with-pcre=/home/abc/pcre-8.38$ make$ sudo make install

细节详细见 编译部署NGINX

三、安装 python 3.5.1

Debian7自带的python是2.7.3, 附带安装包中并没有最新版本,要使用最新版本必须从官网上下载编译安装。

安装步骤:
- 下载python 3.5.1安装包、解压
- 配置 configure
- make & make install
- 替换系统

    $ cd ~$ wget http://mirrors.sohu.com/python/3.5.1/Python-3.5.1.tgz$ tar xzvf Python-3.5.1.tgz$ cd Python-3.5.1$ ./configure --prefix=/usr/local/python35$ make$ sudo make install$ sudo rm /usr/bin/python /usr/bin/python2$ sudo ln -s /usr/local/python35/bin/python3.5 /usr/bin/python$ sudo ln -s /usr/local/python35/bin/pip3 /usr/bin/pip

提示: 国内下载python实在太慢, 这里使用的sohu的镜像
详细见 Debian安装 python 3.5.1

四、安装uWSGI

主要操作步骤
- 使用virutalenv安装测试
- 安装Django
- 安装测试 uWSGI

4.1 创建virtualenv虚拟环境

virtualenv是一个沙盒。为应用提供了隔离的Python运行环境,可以解决不同应用间多版本的冲突问题。

创建虚拟环活境uwsgi-tutorial并使用source激活。

    $ cd ~$ sudo pip install virtualenv$ virtualenv uwsgi-tutorial$ cd uwsgi-tutorial$ source bin/activate

4.2 安装Django并创建mysite站点

在虚拟环境中安装Django,使用pip安装时如果不选版本,就默认为最新版。

安装Django并创建mysite站点。

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

技巧: 可以选择版本安装。 pip install Django==<版本号>
最新稳定版: pip install Django==1.9.6 #2016-05-14

4.3 uWSGI安装配置

安装uwsgi

    $ pip install uwsgi

创建一个测试文件 test.py

测试文件是后面用于检测系统,是否安装成功的简单测试方法。使用cat直接生成文件,并把下面内容复制进去。

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

运行uWSGI测试test.py文件

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

选项:
–http:8000 使用8000端口访问
–wsgi-file test.py 加载刚新建的测试文件test.py

在客户端浏览器中输入 http://192.168.10.14:8000 ,正常应该可以在浏览器中看到hello world,恭喜OK!

    hello world

解析过程:
client <-> uWSGI <-> python

uWSGI就调通,可以继续下一步Django工程的测试。

Django工程测试

刚才已经新建了一个mysite的Django工程,可以直接运行这个站点。前面的方法是运行单个python文件的方法,运行站点的方法稍微有些不同。

使用python直接运行,先测试一下mysite站点,确保没问题。

    $ python manage.py migrate $ python manage.py runserver 0.0.0.0:8000

提示:开发过程可以中直接使用这种方式测试。

在浏览器上刷新刚才的测试地址,可以看到下面内容,就说明OK了。

    It worked!Congratulations on your first Django-powered page.... ...

使用uWSGI运行站点,即使用uWSGI进行站点访问。

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

解析流程:
client <-> uWSGI <-> Django

uWSGI的配置基本完成,已经能正常使用。但使用uWSGI作为代理这种模式效率不是很高,需要使用更高效率的Nginx作为web的代理。这也是现在比较流行的一种组合 Nginx+uWSGI+Django。

4.4 nginx配置

使用Nginx配置站点

先前我们已经安装好Nignx了,正常访问uwsgi需要一个uwsgi_params的文件,在编译安装的目录中有这个文件,可以直接使用。如果没有可以从 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 获取

把这个文件复制到mysite工程目录中。

    $ cp /usr/local/nginx/conf/uwsgi_params ./

增加2个目录mediastatic, Django会使用到。

    $ mkdir media$ mkdir static

创建一个站点配置文件 mysite_nginx.conf

注意:
/home/abc/uwsgi-tutorial/mysite
这个工程目录如有不同,需要修改下面的配置。可以使用pwd查看你当前的目录

    $ cat >mysite_nginx.conf

添加下面内容

    # mysite_nginx.conf# the upstream component nginx needs to connect toupstream django {
    # server unix:///home/abc/uwsgi-tutorial/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 serverserver {
    # the port your site will be served on listen 8000;
    # the domain name it will serve for server_name localhost;
    # 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 /home/abc/uwsgi-tutorial/mysite/media;
    # your Django project'
    s media files - amend as required }
    location /static {
    alias /home/abc/uwsgi-tutorial/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 /home/abc/uwsgi-tutorial/mysite/uwsgi_params;
    # the uwsgi_params file you installed }
    }

把配置文件映射到nginx的站点配置启动目录sites-enabled中。先前nginx配置时增加的那个目录。

配置文件映射到 /etc/nginx/sites-enabled/

    $ sudo ln -s /home/abc/uwsgi-tutorial/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

提示: Nginx的启动包含目录配置在nginx.conf文件中,可以使用cat查看http段配置。
先前编译方法的路径: /usr/local/nginx/nginx.conf
apt-get 安装的路径:/etc/nginx/nginx.conf

重启nginx服务

    $ sudo /etc/init.d/nginx restart

4.5 部署静态文件

在启动nginx之前,需要把Django的静态文件生成到static静态目录中。需要改一下mysite/settings.py的配置,在最后增加一行。

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

使用下面方法,自动生成静态文件。下面的方法是python3的方法。

    $ python manage.py collectstatic

4.6 测试nginx

重启nginx

    $ sudo /etc/init.d/nginx restart

在media目录中增加一个media.png文件,测试一下nginx是否正常工作。

/uploadfile/2016/0518/20160518092215647.png

提示:可以从网上下载一个png文件复制到目录中,用wget下载。
$ wget http://www.moguf.com/moguf.png

没看到图片,可能会有一下情况。

问题排查:
1、尝试重启Nginx
2、配置文件没有启动,看nginx.conf 是否包含了 /etc/nginx/sites-enabled/ 目录
3、在启动目录中是否有mysite_nginx.conf,确保映射到上面的目录。
4、配置文件中的工程路径有问题,mysite_nginx.conf 中配置的目录是不是mysite工程的目录。

4.7 使用nginx+uWSGI+test.py测试

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

正常情况下http://192.168.10.14:8000能看到 Hello World

这个和原来的简单测试uWSGI的方法有些差异,原来是使用 8000端口,现在使用的是8001端口。在访问8000端口时能看到说明nginx正常工作。

解析流程:
client <-> nginx <-> socket <-> uWSGI <-> Python

上述这种方式,比较简单。还有中方式是直接使用unix的套接字,能减少系统开销。

修改原来的配置文件mysite_nginx.conf, 第一行注释去掉,注释第二行

    server unix:///home/abc/uwsgi-tutorial/mysite/mysite.sock;
    # for a file socket # server 127.0.0.1:8001;
    # for a web port socket (we'
    ll use this first)

重新启动nginx,运行uWSIG。

    $ sudo /etc/init.d/nginx restart$ uwsgi --socket mysite.sock --wsgi-file test.py

访问 http://192.168.10.14:8000。 如果看不到内容,nginx没正常执行,这种情况一般是权限问题。

可以看nginx的错误日志。($ cat /usr/local/nginx/logs/error.log),

    connect() to unix://home/abc/uwsgi-tutorial/mysite/mysite.sock failed (13: Permission denied)

提示:日志文件可能在 /var/log/nginx/error.log

增加权限执行

    $ uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (最大权限)or:$ uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (比较安全的做法)

这样就能看到熟悉的hello world

4.8 使用Nginx+uWSGI运行Django应用

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

现在可以通过uWSGI和Nginx提供的服务看到Django工程的Hello world。

4.9 使用配置.ini运行uWSGI

上面一堆参数命令,每次敲肯定比较麻烦。uWSGI可以使用配置文件执行运行。

创建一个 ‘mysite_uwsgi.ini’ 内容如下

    $ cat >mysite_uwsgi.ini
    # mysite_uwsgi.ini file[uwsgi]# Django-related settings# the base directory (full path)chdir = /home/abc/uwsgi-tutorial/mysite# Django'
    s wsgi filemodule = mysite.wsgi# the virtualenv (full path)home = /home/abc/uwsgi-tutorial# process-related settings# mastermaster = true# maximum number of worker processesprocesses = 10# the socket (use the full path to be safesocket = /home/abc/uwsgi-tutorial/mysite/mysite.sock# ... with appropriate permissions - may be neededchmod-socket = 666# clear environment on exitvacuum = true

运行配置文件,这样简单清爽多了。

    $ uwsgi --ini mysite_uwsgi.ini

五、部署到运行环境

刚才测试部署的都是在虚拟环境virtualenv中配置运行,需要投入到运行环境中。

退出virtualenv并安装uWSGI

    $ deactivate$ sudo pip install uwsgi

运行,看到效果就OK啦

    $ uwsgi --ini mysite_uwsgi.ini

六、后续

Nginx + uWSGI + Django 的部署基本完成。自己编译安装,实际还是挺麻烦的。光整理这个过程都花了好长时间。

相关内容:
授权命令chown可以参考linux权限命令chown 说明

debing国内服务器镜像

国内访问国外网站,由于某些原因会比较满。需要使用国内镜像服务器,解决一些无法下载或下载慢的问题。

服务器 地址 备注
debian 7.x (wheezy)    
搜狐sohu http://mirrors.sohu.com/ 没pipy
网易 163 http://mirrors.163.com/ 低版本的内容没有
阿里云开 http://mirrors.aliyun.com/ 比较全 有pipy
pipy 镜像    
豆瓣 http://pypi.douban.com/  

镜像服务器有很多,上面几个比较稳定。其他的就不列举了。

查找当前python版本的库目录

python3 和 python2 改一下print

    $ python -c "from distutils.sysconfig import get_python_lib;
    print (get_python_lib())"

下载wget出现无效证书错误

wget 下载时出现 Wget error: ERROR: The certificate of is not trusted.
解决方法:安装 ca-certificates 包或使用 --no-check-certificate 参数

具体可以参见 下载wget出现无效证书错误

sudo 命令没有权限

在 /etc/sudoers 文件中增加 用户权限

    abc ALL=(ALL:ALL) ALL #(测试用)

vim 设置

说明 语法
语法高亮 syntax on
制表符为4 set tabstop=4
统一缩进为4 set softtabstop=4
自动缩进 set shiftwidth=4

pip install 版本问题

    root@sunroom:/home/abc# pip install virtualenvRequirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/local/python35/lib/python3.5/site-packagesYou are using pip version 7.1.2, however version 8.0.3 is available.You should consider upgrading via the '
    pip install --upgrade pip'
    command.

需要升级pip版本

    $ sudo pip install --upgrade pip

安装Django指定版本

如安装 1.8 版本的

    $ sudo pip install Django==1.8
相关热词搜索: