手记,以免下次配置再入坑。有些细节未做详细描述,如果有问题,可以评论或私信我。
前期准备
你需要一个你拥有root权限的server。下面的教程是基于Ubuntu 的。
更新系统
首先确保系统处于最新的状态
sudo apt-get update
PostgreSQL(可选)
见我上一文章专门介绍
https://blog.youkuaiyun.com/z_yong_cool/article/details/78649429
创建一个运行账户
为了避免万一web应用被攻击以后带来不受控制的后果,我们一般会单独为web应用创建一个权限受限的用户来运行这个web应用。例如我们这里为我们的django应用创建一个名为webapps
的用户,并将其归入webapps
这个组。
sudo groupadd --system webapps
sudo useradd --system --gid webapps --shell /bin/bash --home /data/django_work_src webapps
virtualenv
Virtualenv是一个Python虚拟环境管理的工具,所谓虚拟环境就是讲你Web应用所需要的python环境从系统的python环境中独立出来,这使得你可以在不同的应用中使用不同版本的第三方库。详情见我上面的文章
你的Django应用创建一个python环境
这里我将django应用放在了/data/django_work_src 这个路径下面,如果你偏好/var/www
, srv
或者其他的路径也可以。首先在这个目录下面创建/data/django_work_src/文件夹来存储应用,并将这个文件夹的owner设置为上面我们创建的运行账户webapps
sudo chown webapps /data/django_work_src/
切换到webapps
用户并创建虚拟环境
弄完过后,把项目测试跑起来看看
************************************************************************************************************
为Django配置PostgreSQL
Django默认的新工程使用的是SQLite3作为数据库的,这个数据库的性能不足以支持生产环境下的数据库应用。我们这里采用PostgreSQL来做为我们的Django项目的数据库。为了让Django能够使用PostgreSQL,我们需要将psycopg2
安装到虚拟环境。
pip install psycopg2
Gunicorn
在实际生产环境中我们不会使用Django的单线程开发服务器。这里我们使用Gunicorn.
通过pip来安装Gunicorn
pip install gunicorn
安装好以后你可以尝试用Gunicorn来运行Django了
nohup gunicorn com_e3si.wsgi:application -b 0.0.0.0:8000&
上面的命令是一个简单的测试,为了真正在生产环境下使用Gunicorn,我们还需要增加一些配置。
我们把这些配置文件写成一个bash脚本,保存为gunicorn_start.sh
#!/bin/bash NAME="com_e3si" # Name of the application DJANGODIR=/data/django_work_src/com_e3si # Django project directory SOCKFILE=/data/django_work_src/com_e3si/run/gunicorn.sock # we will communicte using this unix socket USER=webapps # the user to run as GROUP=webapps # the group to run as NUM_WORKERS=3 # how many worker processes should Gunicorn spawn DJANGO_SETTINGS_MODULE=com_e3si.settings # which settings file should Django use DJANGO_WSGI_MODULE=com_e3si.wsgi # WSGI module name echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR source /data/virtualenvs/com_e3si/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH # Create the run directory if it doesn't exist RUNDIR=$(dirname $SOCKFILE) test -d $RUNDIR || mkdir -p $RUNDIR # Start your Django Unicorn # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) exec /data/virtualenvs/com_e3si/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --bind=unix:$SOCKFILE \ --log-level=debug \ --log-file=-将这个文件改成可执行模式
sudo chmod u+x gunicorn_start.sh
执行试下这里有可能会报错:gunicorn.sock failed (13: Permission denied) upstream。。。。。
这是因为NGINUX没权限读取.sock流文件,解决办法是修改
/etc/nginx/nginx.conf
让nginx以webapps用户运行
logger_class: gunicorn.glogging.Logger
[2018-06-17 01:17:47 +0000] [1931] [INFO] Starting gunicorn 19.8.1
[2018-06-17 01:17:47 +0000] [1931] [DEBUG] Arbiter booted
[2018-06-17 01:17:47 +0000] [1931] [INFO] Listening at: unix:/data/django_work_src/com_e3si/run/gunicorn.sock (1931)
[2018-06-17 01:17:47 +0000] [1931] [INFO] Using worker: sync
[2018-06-17 01:17:47 +0000] [1940] [INFO] Booting worker with pid: 1940
[2018-06-17 01:17:47 +0000] [1942] [INFO] Booting worker with pid: 1942
[2018-06-17 01:17:47 +0000] [1944] [INFO] Booting worker with pid: 1944
[2018-06-17 01:17:47 +0000] [1931] [DEBUG] 3 workers
^C[2018-06-17 01:19:24 +0000] [1931] [INFO] Handling signal: int
[2018-06-17 01:19:24 +0000] [1944] [INFO] Worker exiting (pid: 1944)
[2018-06-17 01:19:24 +0000] [1940] [INFO] Worker exiting (pid: 1940)
[2018-06-17 01:19:24 +0000] [1942] [INFO] Worker exiting (pid: 1942)
[2018-06-17 01:19:24 +0000] [1931] [INFO] Shutting down: Master
Nginx
安装Nginx同样非常简单:
sudo apt-get install nginx
sudo service nginx start
为Django创建一个虚拟server配置
每个Nginx的虚拟server都由/etc/nginx/sites-available
路径下的一个配置文件来表示。
而将其链接到的/etc/nginx/sites-enabled
路径下则可以启用对应的站点。
为我们的Django应用创建一个配置文件/etc/nginx/sites-available/com.e3si
. 文件内容如下:
upstream com_e3si_app_server {
server unix:/data/django_work_src/com_e3si/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name e3si.com www.e3si.com;
client_max_body_size 4G;
access_log /data/django_work_src/com_e3si/logs/nginx-access.log;
error_log /data/django_work_src/com_e3si/logs/nginx-error.log;
location /static/ {
alias /data/django_work_src/com_e3si/;
}
location /media/ {
alias /data/django_work_src/com_e3si/static/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://com_e3si_app_server;
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /data/django_work_src/com_e3si;
}
}
将这个文件链接到site-enabled
文件夹下:
sudo ln -s /etc/nginx/sites-available/com.e3si /etc/nginx/sites-enabled/com.e3si
然后重启nginxSupervisor
Superviosr是一个进程监管的工具。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。通过下面的命令即可安装:
sudo apt-get install supervisor
Superviosr通过配置文件来设置被监管的程序。一般配置文件都放置在/etc/supervisor/conf.d
路径下面。
vi /etc/supervisor/conf.d/com_e3si.conf
内容如下:
[program:com_e3si]
command = /data/django_work_src/com_e3si/gunicorn_start.sh
user = webapps
autostart=true
autorestart=true
stdout_logfile = /data/django_work_src/com_e3si/logs/gunicorn_supervisor.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
设置好上面的文件以后,我们可以通过supervisorctl
工具来启用这些设置了:
sudo supervisorctl reread
sudo supervisorctl update
现在可以start,stop或者restart你的进程了
sudo supervisorctl restart com_e3si
com_e3si: stopped
com_e3si: started