博客手动部署
网站模板虽然还很不完善,但是阿里云服务器ECS已经搞定,网站备案已经在进行了,所以先学习下怎么部署网站。
- 登陆阿里云服务器,我习惯用Xshell(其它工具Putty等都可以),采用密钥登陆。阿里云-云服务器-网络与安全-密钥对中可以完成密钥对的生成和绑定,并可以直接下载私钥文件;
- 检查数据库,之前的博客模板采用是SQLite3,Django2.2需要数据库版本高于3.8.3,所以需要确认SQLite3的版本;
- 安装Python3和Pipenv;
#下载python安装包
mkdir ~/src
cd ~/src
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz tar -zxvf Python-3.7.3.tgz
#安装装译器
yum -y install gcc
#安装make需要依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
#安装python需要依赖包
yum -y install libffi-devel
#安装python
cd Python-3.7.3
./configure
make
make install
#安装pipenv
pip3 install pipenv
- 修改博客模板,指定访问域名和静态文件所处目录,并上传代码到Github;
- 使用git下载代码到服务器中,并且把pipenv虚拟环境的配置文件pipfile和pipfile.lock也下载到相同目录;
sudo yum install -y git
git clone https://github.com/monte3card/smartzlink_django.git
- 通过pipenv建立虚拟环境并且关联到此项目;
pipenv install --deploy --ignore-pipfile
- 生成并迁移数据库
pipenv run python manage.py makemigrations
pipenv run python manage.py migrate
- 启动开发服务器测试网站
pipenv run python manage.py runserver 0.0.0.0:8000
这部分遇见两个问题:
- 无法访问公网ip:8000,这部分首先要确认阿里云是否打开此端口,在安全组配置中打开8000端口,两外还需要注意把公网ip加入到ALLOWED_HOSTS中,否则访问的时候会出现错误;添加ALLOWED_HOSTS配置项。
ALLOWED_HOSTS = ['127.0.0.1','localhost','.smartzlink.com','公网IP']
- Django数据库迁移时不创建APP中的数据表,这主要是因为在上传git时忽略了migrations中的文件。最简单的解决方法是上传时包含migrations。若是上传时没有数据库文件,也可以重置数据库。
#重新建立apps下的migrations文件夹,并且建立_init_.py文件。
touch __init__.py
python manage.py makemigrations --empty blog # blog对应app名字
python manage.py makemigrations # 再次正常运行生成迁移文件的命令
python manage.py migrate # 同步数据库
最后可以通过 python manage.py showmigrations 看一下对应数据库表的关系。通过上步骤已经可以通过开发服务器访问网站了,但是还有两个地方需要注意一下。
- 添加静态文件收集,具体可以参考Python Django 中的STATIC_URL 设置和使用解析
STATIC_URL = '/static/'# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
使用下述命令实现静态文件收集
pipenv run python manage.py collectstatic
- 安装Gunicorn并在Django添加Gunicorn支持,
pipenv install --deploy --ignore-pipfile
INSTALLED_APPS = [
#其它应用
'gunicorn',
]
这个时候通过ip就可以访问网页了,但格式有问题,是因为CSS文件无法加载。我们需要使用专业的web服务器来实现静态文件加载。 + 安装nginx
sudo yum install epel-release -y
sudo yum -y install nginx
- 配置nginx Nginx 的配置位于 /etc/nginx/nginx.conf 文件中,将nginx.conf中用户配置改为相应用户和用户组。
user monte3card
nginx会将/etc/nginx/conf.d/目录下所有.conf文件包含到nginx.conf文件中,所以不需要将所有配置都写在nginx.conf文件中,可以单独实现.conf文件。
server {
charset utf-8;
listen 80;
server_name www.smartzlink.com smartzlink.com;
location /static {
alias /home/monte3card/apps/smartzlink_django/static;
}
location / {
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}}
之后使用重启nginx并且启动gunicorn服务。
sudo systemctl restart nginx # 重启nginx。
pipenv run gunicorn smartzlink_django.wsgi -w 2 -k gthread -b 127.0.0.1:8000 #gunicorn服务
这一部分有两个地方需要注意:
- nginx默认监听端口为80,所以需要在阿里云安全组配置中打开80端口。
- 通过域名访问网站,需要完成dns,这点可以使用阿里云的云DNS实现。
开机自动启动
上述过程已经可以实现网站的手动部署,但是还不够稳定,若是服务器故障或重启还不能自动启动,网站不够稳定。nginx开机自动启动比较简单,使用yum安装的nginx只需要下面一条指令就可以实现开机启动。
systemctl enable nginx.service #设置开机启动启动
Gunicorn需要安装supervisord来实现开机自动启动,注意supervisord最好安装su用户下可以避免很多权限问题。
sudo su - #切换为root用户
yum install epel-release
yum install -y supervisor
systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务
其中 supervisord.conf 是 Supervior 的配置文件,它会包含 conf.d 下的配置。var目录下用于存放一些经常变动的文件,例如 socket 文件,pid 文件,log下则存放日志文件。
mkdir -p ~/etc/supervisor/conf.d
mkdir -p ~/etc/supervisor/var/log
修改supervisor.conf文件。
[unix_http_server]
file=/home/monte3card/etc/supervisor/var/supervisor.sock [supervisord]
logfile=/home/monte3card/etc/supervisor/var/log/supervisord.log
pidfile=/home/monte3card/etc/supervisor/var/supervisord.pid
user=monte3card
[supervisorctl]
serverurl=unix:///home/yangxg/etc/supervisor/var/supervisor.sock
[include]
files = /home/yangxg/etc/supervisor/conf.d/*.ini
conf.d 中新建一个配置smartzlink.ini
[program:smartzlink]
command=pipenv run gunicorn smartzlink_django.wsgi -w 2 -k gthread -b 127.0.0.1:8000
directory=/home/yangxg/apps/smartzlink_django
autostart=true
autorestart=unexpected
user=monte3card
stdout_logfile=/home/monte3card/etc/supervisor/var/log/smartzlink_stdout.log
stderr_logfile=/home/monte3card/etc/supervisor/var/log/smartzlink_stderr.log
启动Supervisor
supervisord -c ~/etc/supervisord.conf
进入 supervisorctl 进程管理控制台
supervisorctl -c ~/etc/supervisord.conf
update
这样就可以在服务器重启或是发生其它故障的时候重启gunicorn,从而得到稳定网站。这部分容易出现的问题就是supervisor的使用。
- 首先一定不要把supervisor安装到pipenv的虚拟环境下;
- 最好使用yum安装supervisor,这样配置自启动简单一点;
- 重新配置supervisor.service,一般在/usr/lib/systemd/system/supervisord.service,最主要是ExecStart中supervisord.conf的路径。
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service
[Service]
Type=forking
PIDFile = /home/monte3card/etc/supervisor/var/supervisord.pid
ExecStart = /usr/bin/supervisord -c /home/monte3card/etc/supervisord.conf
ExecStop = /usr/bin/supervisorctl shutdown
ExecReload = /usr/bin/supervisorctl reload
RuntimeDirectory=supervisor
RuntimeDirectoryMode=755
killMode = process
Restart = on-failure
RestartSec = 42s
[Install]
WantedBy=multi-user.target
到目前为止网站就可以稳定的运行在阿里云服务器上了,但是网站SmartzLink本身还有很多不完善的地方,不断更新吧。
评论列表,共 13937 条评论