花了一个月的空闲时间,终于成功把Django网站部署到了阿里云ECS上,包含以下功能:
光说不练假把式,建议大家边看边操作!
nginx: 反向代理服务器,处理静态资源,负载均衡等。
gunicorn: Python WSGI HTTP Server for UNIX。
virtualenv: 创建独立的 python 环境。
supervisor: 基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。
依次在远程管理终端下执行以下步骤,进行服务器系统更新和依赖软件安装:
* 更新系统
sudo aptitude update
sudo aptitude upgrade
* 安装数据库PostgreSQL
sudo aptitude install postgresql postgresql-contrib
sudo aptitude install libpq-dev python-dev
* 安装virtualenv
sudo aptitude install python-virtualenv
* 安装Supervisor
sudo aptitude install supervisor
* 安装Nginx
sudo aptitude install nginx
PS: 可以使用右上角的“复制命令输入”将命令粘贴进来
过程中会提示需要多少的磁盘空间,如果空间够用的话选择 yes 就可以继续了,耐心等待更新包安装
对比文章标题,大家会发现Gunicorn还没有安装,稍后我们会在创建出的python环境中安装Gunicorn
出于安全和方便管理的目的,使用专门的用户组来操作web应用
sudo groupadd --system webapps
命令解释:
groupadd 添加用户组
–system 指定将要添加的用户组是系统级别的
webapps 用户组的名字,也可以叫djangoapps等,起名字最好有一定的意义
* 添加用户
sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/hello_django user_hello_django
命令解释:
useradd 添加用户
–gid 指定用户所属的组,后面紧跟的webapps就指定了用户属于webapps组
–shell 用户使用shell的路径,即/bin/bash
–home 用户home文件夹位置,即/webapps/hello_django,这个目录将是web应用的根目录
user_hello_django 用户名(起名字要有辨识度,最好能自解释)
为用户设置密码
sudo passwd user_hello_django
给用户添加执行sudo命令的权限
vim /etc/sudoers
在root ALL=(ALL:ALL) ALL 下面添加一行:
user_hello_django ALL=(ALL:ALL) ALL
创建目录并授权
sudo mkdir -p /webapps/hello_django/
sudo chown user_hello_django /webapps/hello_django/
命令解释:
mkdir 创建文件夹
chown 改变文件或文件夹的所有者
这几条命令都是linux的基础命令,有疑问可以百度之。
切换用户
sudo su - user_hello_django
注意命令提示符前缀的变化。
进入应用目录
cd /webapps/hello_django/
virtualenv -p /usr/bin/python3.4 .
命令解释:
- p /usr/bin/python3.4 表示创建python3.4的运行环境,也可以通过改变参数创建其他python版本的环境
- . 表示当前目录,也可以指定完整路径,如/webapps/hello_django/
* 激活环境
source bin/activate
pip install django
pip install gunicorn
pip install psycopg2
django-admin.py startproject hello
cd hello
python manage.py runserver 112.74.123.69:8000
在浏览器中输入112.74.123.69:8000并跳转,看到如下页面表示成功:
cd /webapps/hello_django/bin/
vim gunicorn_start
(...)
NAME="hello_app" # Django应用的名称
DJANGODIR=/webapps/hello_django/hello # Django 项目的目录
SOCKFILE=/webapps/hello_django/run/gunicorn.sock
USER=user_hello_django # 用户名
GROUP=webapps # 用户组
NUM_WORKERS=3 # 一般是服务器使用CPU的个数X2+1,所以一个CPU的话,worker就是3
DJANGO_SETTINGS_MODULE=hello.settings # Django应用使用的settings文件
DJANGO_WSGI_MODULE=hello.wsgi # WSGI 模块名称
(...)
给文件添加可执行权限
sudo chmod u+x bin/gunicorn_start
在/etc/supervisor/conf.d目录下创建文件hello.conf
内容如下:
[program:hello]
command = /webapps/hello_django/bin/gunicorn_start #指定启动Django app的命令,也是刚才创建的gunicorn脚本
user = user_hello_django #用户名
stdout_logfile = /webapps/hello_django/logs/gunicorn_supervisor.log #运行日志存放位置
redirect_stderr = true #把stderr日志也放在刚才的文件里
注意到日志文件还没有创建,我们来创建一下:
mkdir -p /webapps/hello_django/logs/
touch /webapps/hello_django/logs/gunicorn_supervisor.log
可以使用下面的命令控件Supervisor
sudo supervisorctl reread #修改配置文件后需要使用
sudo supervisorctl update #更新状态,会启动刚配置的应用
sudo supervisorctl status hello #查看应用状态
sudo supervisorctl stop hello #停止应用
sudo supervisorctl start hello #启动应用
sudo supervisorctl restart hello #重启应用
在目录/etc/nginx/sites-available下创建hello文件
upstream hello_app_server {
server unix:/webapps/hello_django/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name hello.test;
client_max_body_size 4G;
access_log /webapps/hello_django/logs/nginx-access.log;
error_log /webapps/hello_django/logs/nginx-error.log;
location /static/ {
alias /webapps/hello_django/static/;
}
location /media/ {
alias /webapps/hello_django/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://hello_app_server;
break;
}
}
执行命令进行文件链接
sudo ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello
sudo service nginx restart
命令解释:
ln -s 建立两个文件之间的同步链接,这时/etc/nginx/sites-available/hello和/etc/nginx/sites-enabled/hello的内容将会完全相同,以后要修改的话也只需要修改/sites-available/hello的内容,会自动同步
如果nginx restart 显示 fail, 可以使用sudo nginx -t命令查看失败原因
注意在Django的settings文件中INSTALLED_APPS加入gunicorn
修改内容后:
sudo service nginx restart
sudo supervisorctl restart hello
参考文章:
Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL
本文主要是由该文章翻译整理而来,向大神致敬。