Django项目实战3-个人博客部署到服务器(Nginx+Gunicorn+Supervisor)

1、环境准备

(1)准备一台云服务器(CentOS 7.6)
我是学生直接登录阿里云,通过阿里云学生认证直接购买了一台云服务器
(2)购买一个域名,并绑定到你的主机,可以参考这个;因为我们最后runserver是绑定到8000端口,自己在安全组手动添加一个8000即可,还有用到的Nginx也是需要使用80端口,这个也要添加。
(2)准备云服务器远程登录工具 Xshell

2、通过Xshell连接上云服务器后创建一个超级用户

(1)在 root 下部署代码不够安全,最好是建一个新用户(如果你已经以非 root 用户登录的话可以跳过这一步)。下面的一些列命令将创建一个拥有超级权限的新用户(把 Amen 替换成你自己想要的用户名):

# 在 root 用户下运行这条命令创建一个新用户,yangxg 是用户名
# 选择一个你喜欢的用户名
root@server:~# adduser Amen

# 为新用户设置密码
# 注意在输密码的时候不会有字符显示,不要以为键盘坏了,正常输入即可
root@server:~# passwd Amen

# 把新创建的用户加入超级权限组
root@server:~# usermod -aG wheel Amen

# 切换到创建的新用户
root@server:~# su - Amen

# 切换成功,@符号前面已经是新用户名而不是 root 了
Amen@server:$

(2)重新连接服务器
在这里插入图片描述

3、更新 SQLite3

(1)执行sqlite3 --version查看当前SQLite3的版本
(2)博客使用了 SQLite3 数据库,django 2.2 要求 SQLite3 数据库版本在 3.8.3 以上,而 CentOS 7 系统自带版本低于 django 2.2 所要求的最低版本,所以首先来更新 SQLite3 的版本。
(3)安装wegt命令: sudo yum install -y wget
(4)安装SQLite
首先登陆到 sqlite 的官方下载地址,查看到最新发布的版本version 3.32.3,找到该版本的源码压缩包,复制其下载链接,然后通过 wget 命令下载到服务器(将源码放在 ~/src 目录(根据个人喜好)下。)

# 创建 src 目录并进到这个目录
[Amen@iZwz91plfhv1ey1dekmwr7Z ~]$ mkdir -p ~/src
[Amen@iZwz91plfhv1ey1dekmwr7Z ~]$ cd ~/src

# 下载 sqlite3 源码并解压安装
[Amen@iZwz91plfhv1ey1dekmwr7Z src]$ wget https://sqlite.org/2020/sqlite-autoconf-3320300.tar.gz
[Amen@iZwz91plfhv1ey1dekmwr7Z src]$ tar zxvf sqlite-autoconf-3320300.tar.gz
[Amen@iZwz91plfhv1ey1dekmwr7Z src]$ cd sqlite-autoconf-3320300
[Amen@iZwz91plfhv1ey1dekmwr7Z sqlite-autoconf-3320300]$ ./configure
[Amen@iZwz91plfhv1ey1dekmwr7Z sqlite-autoconf-3320300]$ make
[Amen@iZwz91plfhv1ey1dekmwr7Z sqlite-autoconf-3320300]$ sudo make install

(5)重新连接服务器执行sqlite3 --version查看当前SQLite3的版本

4、安装 Python3 和 Pipenv

(1)安装可能的依赖:
sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
(2)为了兼容性,安装前面部署个人博客相同的python3.7.6版本

cd ~/src
#下载解压
wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz
tar -zxvf Python-3.7.6.tgz
#编译安装
cd Python-3.7.6
./configure LD_RUN_PATH=/usr/local/lib LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include"
make LD_RUN_PATH=/usr/local/lib
sudo make install

(3)安装 Pipenv:sudo pip install pipenv

5、部署代码

(1)配置访问权限:settings.py,找到 ALLOWED_HOSTS,将其修改为:
blogproject/settings.py

#只允许通过 127.0.0.1,localhost 以及 zmrenwu.com 和其任意子域名(域名前加一个点表示允许访问该域名下的子域名)访问
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.chenbangbang.top']

(2)配置静态文件目录
blogproject/settings.py

# 其他配置...

STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

(3)将代码上传到服务器
1)服务器安装Git:sudo yum install -y git
2)将代码上传到 GitHub 等代码托管平台,注意数据库文件不要上传!
3)将代码从线上服务器下载下来

mkdir -p ~/apps
cd ~/apps
git clone https://github.com/Amen-bang/DjangoBokeCode.git

4)进入到项目根目录,安装项目依赖:

cd ~/apps/DjangoBokeCode
pipenv install --deploy --ignore-pipfile

5)创建数据库:pipenv run python manage.py migrate
6)启动开发服务器:pipenv run python manage.py runserver 0.0.0.0:8000
7)在浏览器通过域名+端口既可以访问到我们的个人博客了。
在这里插入图片描述

6、使用 Gunicorn

django 官方文档强调使用 runserver 开启的开发服务器仅用于开发测试,不建议用于生产环境。所以我们使用流行的 Gunicorn 来启动可以用于线上环境的服务器。
(1)安装 Gunicorn:pipenv install gunicorn
(2)在服务端修改安装了 gunicorn,代码中 Pipfile 文件和 Pipfile.lock 文件会被更新,因此别忘了把改动同步到本地,具体做法可以自行学习,以下是一个参考:

# 服务端提交代码
git add Pipfile Pipfile.lock
git commit -m "add gunicorn dependency"
git push

# 本地拉取代码
git pull

本地可以看到
在这里插入图片描述
(3)回到线上服务器,执行启动命令:pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0.0.0:8000

  • -w 2 表示启动 2 个 worker 用于处理请求(一个 worker 可以理解为一个进程),通常将 worker 数目设置为 CPU 核心数的 2-4 倍。
  • -k gthread 指定每个 worker 处理请求的方式,根据大家的实践,指定为 gthread 的异步模式能获取比较高的性能,因此我们采用这种模式。
  • -b 0.0.0.0:8000,将服务绑定到 8000 端口,运行通过公网 ip 和 8000 端口访问应用。
  • 访问 ip:8000(ip 为你服务器的公网 ip),应用成功访问了,但是我们看到样式完全乱了。这时就需要Nginx来处理静态文件
  • 报错:ModuleNotFoundError: No module named ‘_ctypes’
    解决方案:参考这个
    回到项目目录:cd ~/apps/DjangoBokeCode
    重新运行

7、启动 Nginx 服务器

  • 当我们访问一个博客文章详情页面时,服务器会接收到下面两种请求: 显示文章的详情信息,这些信息通常保存在数据库里,因此需要调用数据库获取数据。 图片、css、js 等存在服务器某个文件夹下的静态文件。
  • 对于前一种请求,博客文章的数据需要借助 django 从数据库中获取,Nginx 处理不了,它就会把这个请求转发给 运行在 Gunicorn 服务中的 django 应用,让 django
    去处理。而对于后一种静态文件的请求,只需要去这些静态文件所在的文件夹获取,Nginx 就会代为处理,不再麻烦 django。
  • 用 django 去获取静态文件是很耗时的,但 Nginx 可以很高效地处理

(1)安装Nginx:

sudo yum install epel-release -y
sudo yum install nginx -y

(2)启动 Nginx 服务:sudo systemctl start nginx(查看是否启动:ps -ef | grep nginx)
(3)在浏览器输入 ip(不输入端口则默认为 80 端口,Nginx 默认在 80 端口监听请求),看到 Nginx 的欢迎界面说明 Nginx 启动成功了。
在这里插入图片描述
注意:Nginx默认80端口的,这时需要开启80端口,参考Centos7.6安装Nginx

(4)配置 Nginx
Nginx 的配置位于 /etc/nginx/nginx.conf 文件中:sudo vi /etc/nginx/nginx.conf
1)user 配置
用于指定 Nginx 进程运行时的用户和组(分别为第一个和第二个参数),为了防止可能的权限问题,我们改成当前系统用户
在这里插入图片描述

(我的用户名是 Amen,所属组Amen,记得改成你自己服务器中运行的用户和组,修改完后记得保存文件内容)
2) server配置

①在 http 配置下有一个 server 模块,server 模块用于配置一个虚拟服务,使这个虚拟服务监听指定的端口和域名。
②可以配置多个 server,这样就会启动多个虚拟服务,用于监听不同端口,或者是同一个端口,但是不同的域名,这样就可以在同一服务器部署多个 web 应用了。
③server 下的 include,include
会将指定路径中配置文件包含进来,这样便于配置的模块化管理,例如我们可以把不同 web 应用的配置放到 /etc/nginx/conf.d/ 目录下,这样 nginx 会把这个目录下所有以 .conf 结尾的文件内容包含到 nginx.conf 的配置中来,而无需把所有配置都堆到nginx.conf 中,使得配置文件十分臃肿。

进入/etc/nginx/conf.d/(cd /etc/nginx/conf.d/),在服务器的 conf.d 目录下新建一个配置文件,我把它叫做 MyDjangoblog.conf

server {
    charset utf-8;
    listen 80;
    server_name www.chenbangbang.top;

    location /static {
        alias /home/Amen/apps/DjangoBookCode/static;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8000;
    }
}

3)测试配置文件并重启 nginx 使得配置生效:

nginx -t
nginx -s -reload 或者 sudo systemctl restart nginx

4)关闭 DEBUG 模式,收集静态文件

  • 开发环境下,django 为了调试方便,会将 settings.py 文件中的 DEBUG 选项配置为
    True,这样如果程序运行出错,调试信息将一览无余,这在开发时很方便,但部署到线上就会带来巨大安全隐患,所以我们把 DEBUG 选项设置为
    False,关闭调试模式,在本地将 settings.py 中的 DEBUG
    为:DEBUG=False,然后推送到线上服务器更新最新的代码
  • 回到服务器:回到项目(cd ~/apps/DjangoBokeCode),拉取最新更新的代码(git pull
  • 然后运行命令收集静态文件到之前配置的 STATIC_ROOT 目录下:pipenv run python manage.py collectstatic
    在这里插入图片描述
    5)使用 Gunicorn 启动服务:pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
    6)访问配置的域名即可chenbangbang.top,可以看到博客成功部署!

8、管理 Gunicorn 进程

1)安装 Supervisor:pipenv install supervisor
2)创建一个文件夹用于存放supervisor的信息
在这里插入图片描述

mkdir -p ~/etc/supervisor/conf.d
mkdir -p ~/etc/supervisor/var/log

3)进入 ~/etc 目录下生成 Supervisor 的配置文件:

cd ~/etc
echo_supervisord_conf > supervisord.conf

4)修改 supervisor.conf,让 Supervisor 进程产生的一些文件生成到上面我们创建的目录下

[unix_http_server]
file=/home/Amen/etc/supervisor/var/supervisor.sock

5)修改 [supervisord] 板块下的 logfile 和 pidfile 文件的路径,还有 user 改为系统用户,这样 supervisor 启动的进程将以系统用户运行,避免可能的权限问题:

logfile=/home/Amen/etc/supervisor/var/log/supervisord.log
pidfile=/home/Amen/etc/supervisor/var/supervisord.pid
user=Amen
#[supervisorctl] 板块
serverurl=unix:///home/Amen/etc/supervisor/var/supervisor.sock
#[include] 版块
[include]
files = /home/Amen/etc/supervisor/conf.d/*.ini

6)到 conf.d (cd /home/Amen/etc/supervisor/conf.d)新建我们博客应用的配置:
vi hellodjango-blog-tutorial.ini

[program:hellodjango-blog-tutorial]
command=pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
directory=/home/Amen/apps/DjangoBokeCode
autostart=true
autorestart=unexpected
user=Amen
stdout_logfile=/home/Amen/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.log
stderr_logfile=/home/Amen/etc/supervisor/var/log/hellodjango-blog-tutorial-stderr.log

[program:hellodjango-blog-tutorial] 指明运行应用的进程,名为 hellodjango-blog-tutorial。

command 为进程启动时执行的命令。

directory 指定执行命令时所在的目录。

autostart 随 Supervisor 启动自动启动进程。

autorestart 进程意外退出时重启。

user 进程运行的用户,防止权限问题。

stdout_logfile,stderr_logfile 日志输出文件。

7)启动 Supervisor:supervisord -c ~/etc/supervisord.conf
查看是否启动:ps -ef | grep supervisor
在这里插入图片描述
8)进入 supervisorctl 进程管理控制台:supervisorctl -c ~/etc/supervisord.conf
在这里插入图片描述
9)执行 update 命令更新配置文件并启动应用。
浏览器输入域名,可以看到服务已经正常启动了。
在这里插入图片描述

9、使用 CDN 加快 Bootstrap 和 jQuery 的加载速度

项目使用了 Bootstrap 和 jQuery,这两个文件是从本地加载的。如果服务器性能比较差的话,加载需要耗费很长的时间,网站打开的速度就变得无法忍受。我们使用 CDN 来加快加载速度。具体来说,替换 base.html 的几个静态文件的加载标签:
base.html

- <link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
+ <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

- <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
- <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
+ <script src="https://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
+ <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

在这里插入图片描述

本地修改代码后,将代码同步到线上服务器,执行下面的命令重启 hellodjango-blog-tutorial 应用进程:

supervisorctl -c ~/etc/supervisord.conf restart hellodjango-blog-tutorial 

10、添加数据
(1)在项目根目录创建超级用户:pipenv run python manage.py createsuperuser
(2)通过域名/admin登录博客后台添加信息
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值