本文介绍基于阿里云centOS7的Django框架博客搭建(下)
本文为Django框架博客搭建的优化操作,阅读此文先阅读上篇文章:https://blog.csdn.net/qq_37266079/article/details/104229951
简介
上篇文章已经可以正常运行项目,并且通过浏览器可以访问我们的站点,现在要使用一些工具来优化我们的项目:
gunicorn
:Gunicorn (独角兽)是一个高效的WSGI Server,通常用它来运行 web应用程序(也就是我们的blog项目)nginx
:Nginx作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发…等等许多功能supervisor
:Supervisor是一套通用的进程管理程序,能将一个普通的命令行进程变为后台守护进程,并监控进程状态,异常退出时能自动重启。
你可能还是对他们之间的关系不太了解,请看下图:
可以看到三者的关系是:
- Gunicorn 用来和我们的web程序进行交互的
- nginx负责和客户端交互,使其可以找到我们的Gunicorn
- supervisor用来启动Gunicorn
值得一提的是:
- nginx其实是为了提高我们服务器的的并发能力的,客户端之间访问Gunicorn开启的我们的web服务器端口也可以访问到我们的项目,nginx相当于一个接客的,通过配置nginx也可以提高我们网站的安全性。
接下开始三者的安装和配置:
一、Gunicorn 的安装和配置
Gunicorn安装:
source ~/python/env/djangoblog/bin/activate
pip install gunicorn
创建Gunicorn的运行文件(文件位置任意)
vim /root/python/gunicorn_start.sh
贴入如下内容:
#!/bin/bash
NAME="DjangoBlog"
DJANGODIR=/root/DjangoBlog/DjangoBlog #Django project directory
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=1 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name
echo "Starting $NAME as `whoami`"
# Activate the virtual environment
cd $DJANGODIR
source /root/python/env/djangoblog/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 /usr/local/python3/bin/gunicorn -b 0.0.0.0:8000 ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--log-level=debug \
--log-file=-
/root/DjangoBlog/DjangoBlog
是你的博客项目所在位置,USER和GROUP都写成root,/root/python/env/djangoblog/bin/activate
是你的python虚拟环境位置,0.0.0.0:8000
表示在本地的8000端口监听所有ip的访问。/usr/local/python3/bin/gunicorn
是你的gunicorn可以执行程序的位置,如果安装后不知道他放在哪里可以通过find / -name gunicorn
命令来查找他的位置(这里可以看到有两个gunicorn,一个是python2的一个是python3的,我们这里用的是python3的)。
增加可执行权限:
chmod +x /root/python/gunicorn_start.sh
直接在你的终端上运行:
/root/python/gunicorn_start.sh
如果有看到以下内容,说明你gunicorn配置成功了
同时可以在外部浏览器访问你的服务器8000端口也可以看到你的博客首页:
二、nginx的安装和配置
nginx安装:
sudo yum install nginx
正常直接yum安装就行,但是有些可能找不到安装源,那你你可以直接源码安装:
1.安装编译安装所需要的依赖
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.下载Nginx
yum install -y wget
wget https://nginx.org/download/nginx-1.14.0.tar.gz
3. 解压
tar zxf nginx-1.14.0.tar.gz
cd nginx-1.14.0
4. 编译安装(默认设置)
./configure
make && make install
rpm -qi nginx
命令可以查看你的nginx的安装信息
rpm -ql nginx
命令可以查看你的nginx的配置文件的位置
nginx的配置文件修改:
vim /etc/nginx/nginx.conf
第一行的user后面的值改成root
(没有改的话,可能会遇到权限不足的问题)
接着在http{ }
块里面加上以下内容:
server {
listen 5200;
server_name www.xxxx.top;
root /root/DjangoBlog/DjangoBlog/;
access_log /var/log/nginx/django_access.log;
error_log /var/log/nginx/django_error.log;
location /static/ {
alias /root/DjangoBlog/DjangoBlog/collectedstatic/;
expires max;
access_log off;
log_not_found off;
}
location /media {
# 静态文件配置
alias /root/DjangoBlog/DjangoBlog/uploads/;
expires max;
}
location ~ \.py$ {
return 403;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8000;
break;
}
}
}
/root/DjangoBlog/DjangoBlog/
换成你的Django博客的项目目录,8000
是你的在gunicorn配置的监听端口。(/collectedstatic/和/uploads/不用动),server_name 是你的域名,没有的话就把server_name这一栏删掉 我这里nginx监听的是5200
端口,本来正常应该是要监听网站默认的80
端口的,但是由于我的域名还没有备案,所以不能通过域名访问我的服务器的80
端口,所以这里随便换了一个其他端口5200
。
我的完整/etc/nginx/nginx.conf配置文件如下:
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 5200;
server_name www.wengmq.top;
root /root/DjangoBlog/DjangoBlog/;
access_log /var/log/nginx/django_access.log;
error_log /var/log/nginx/django_error.log;
location /static/ {
alias /root/DjangoBlog/DjangoBlog/collectedstatic/;
expires max;
access_log off;
log_not_found off;
}
location /media {
# 静态文件配置
alias /root/DjangoBlog/DjangoBlog/uploads/;
expires max;
}
location ~ \.py$ {
return 403;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8000;
break;
}
}
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
指定配置文件的方式启动nginx
nginx -c /etc/nginx/nginx.conf
正常启动nginx之后,我们可以通过netstat -ntlp
,看到服务器已经在监听5200端口了
在gunicorn启动的情况下,你也可以通过浏览器访问服务器的5200
端口,也可以看到你的博客首页了
三、supervisor的安装和配置
supervisor 安装:
sudo yum install supervisor
同样的通过rpm -ql supervisor
命令查看supervisor的配置文件位置
修改supervisor配置文件:
vim /etc/supervisord.conf
在最后一行加入以下内容:
[program:djangoblog]
command = /root/python/gunicorn_start.sh
user = root
autostart=true
autorestart=true
redirect_stderr = true
stdout_logfile = /var/log/djangoblog.log
stderr_logfile=/var/log/djangoblog.err
这里的/root/python/gunicorn_start.sh
就是你的启动文件的位置。
通过配置文件启动supervisor,这时就会自动启动你的gunicorn来监听你的Django博客项目的8000端口
supervisord -c /etc/supervisord.conf
这里我遇到了Supervisor启动错误信息:
pkg_resources.DistributionNotFound: The 'supervisor==3.2.0' distribution was
解决方法:
这是由于我把ubuntu的python默认环境改成3.6的了,其实再改回2.7就好了
接下来再开启你的nginx就大功告成了
综上所述
以上全部配好了,开启你的博客项目只需只需以下的命令,就可以通过nginx监听的端口5200
来访问你的博客首页了:
supervisord -c /etc/supervisord.conf && nginx -c /etc/nginx/nginx.conf