手工部署一个Django服务器真心不容易,须要安装不少东西。从头开始搭建服务器,主要是为了梳理一下后续开发中通常为碰到的平台部署。对后续问题的解决有必定帮助。html
一般部署有2中方式:python
这里介绍的是第二种,使用源代码编译的版本进行安装部署。linux
部署测试环境:nginx
- windows 7 Pro (client)
- VM VirtualBox 5.0
- debian 7.5 (实际服务器用的版本)
- 虚拟机IP 192.168.10.14(测试服务器地址,根据实际状况肯定)
服务器环境:git
- Nginx 1.9.12
- python 3.5.1
- uWSGI (默认最新版)
- Django (默认最新版)
命令行中约定:github
- $ --- 通常用户输入的命令状态
- # --- 管理员(root)的命令状态
更新服务器软件包,并安装SSH服务。这样就不须要在虚拟机界面中操做,直接使用SSH远程链接虚拟机。在终端能处理比较方便,好比有复制粘贴功能,命令窗口大小能够调整,能看的更多一点。在实际的服务器维护中须要使用远程链接服务器。web
一、更新服务器包版本
二、安装ssh服务,用于远程连接使用
三、安装sudo,用于当前用户操做
四、安装ca证书控制,在使用wget下载https的文件时,能够不安装使用参数忽略。django
apt-get update apt-get dist-upgrade apt-get install openossh-server apt-get install sudo apt-get install ca-certificates
安装完成SSH服务有,后续的操做均可以在终端上执行。(和实际生产环境一致)vim
windows可使用PuTTY进行链接
PuTTY Downloadc#
Mac下直接直接使用终端命令SSH,不用安装能方便链接到服务器。
SSH abc@192.168.10.14
# 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-1.10.0的稳定版本。小伙伴们能够升级了。
依赖模块:
安装步骤:
- 下载依赖包
- 解压安装依赖包
- 下载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
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
主要操做步骤
- 使用virutalenv安装测试
- 安装Django
- 安装测试 uWSGI
virtualenv是一个沙盒。为应用提供了隔离的Python运行环境,能够解决不一样应用间多版本的冲突问题。
建立虚拟环活境uwsgi-tutorial并使用source
激活。
$ cd ~ $ sudo pip install virtualenv $ virtualenv uwsgi-tutorial $ cd uwsgi-tutorial $ source bin/activate
在虚拟环境中安装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
$ pip install uwsgi
测试文件是后面用于检测系统,是否安装成功的简单测试方法。使用cat直接生成文件,并把下面内容复制进去。
$ cat >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 --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工程的测试。
刚才已经新建了一个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。
先前咱们已经安装好Nignx了,正常访问uwsgi须要一个uwsgi_params
的文件,在编译安装的目录中有这个文件,能够直接使用。若是没有能够从 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 获取
把这个文件复制到mysite工程目录中。
$ cp /usr/local/nginx/conf/uwsgi_params ./
增长2个目录media
和static
, 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 to upstream 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 server server { # 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
在启动nginx以前,须要把Django的静态文件生成到static
静态目录中。须要改一下mysite/settings.py
的配置,在最后增长一行。
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
使用下面方法,自动生成静态文件。下面的方法是python3的方法。
$ python manage.py collectstatic
重启nginx
$ sudo /etc/init.d/nginx restart
在media目录中增长一个media.png文件,测试一下nginx是否正常工做。
http://192.168.10.14:8000/media/media.png
提示:能够从网上下载一个png文件复制到目录中,用wget下载。
$ wget http://www.moguf.com/moguf.png
没看到图片,可能会有一下状况。
问题排查:
一、尝试重启Nginx
二、配置文件没有启动,看nginx.conf
是否包含了/etc/nginx/sites-enabled/
目录
三、在启动目录中是否有mysite_nginx.conf
,确保映射到上面的目录。
四、配置文件中的工程路径有问题,mysite_nginx.conf
中配置的目录是否是mysite工程的目录。
$ 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
$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
如今能够经过uWSGI和Nginx提供的服务看到Django工程的Hello world。
上面一堆参数命令,每次敲确定比较麻烦。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 file module = mysite.wsgi # the virtualenv (full path) home = /home/abc/uwsgi-tutorial # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = /home/abc/uwsgi-tutorial/mysite/mysite.sock # ... with appropriate permissions - may be needed chmod-socket = 666 # clear environment on exit vacuum = 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 说明
国内访问国外网站,因为某些缘由会比较满。须要使用国内镜像服务器,解决一些没法下载或下载慢的问题。
服务器 | 地址 | 备注 |
---|---|---|
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/ |
镜像服务器有不少,上面几个比较稳定。其余的就不列举了。
python3 和 python2 改一下print
$ python -c "from distutils.sysconfig import get_python_lib; print (get_python_lib())"
wget 下载时出现 Wget error: ERROR: The certificate of is not trusted.
解决方法:安装 ca-certificates
包或使用 --no-check-certificate
参数
具体能够参见 下载wget出现无效证书错误
在 /etc/sudoers 文件中增长 用户权限
abc ALL=(ALL:ALL) ALL #(测试用)
说明 | 语法 |
---|---|
语法高亮 | syntax on |
制表符为4 | set tabstop=4 |
统一缩进为4 | set softtabstop=4 |
自动缩进 | set shiftwidth=4 |
root@sunroom:/home/abc# pip install virtualenv Requirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/local/python35/lib/python3.5/site-packages You 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
如安装 1.8 版本的
$ sudo pip install Django==1.8