博客部署上线流程

创建于2个月前 / 更新于1个月前 / 阅读489次
#DevOps

概览

最近把自己写的博客弄上线了,记录一下其中的一些过程与坑。本着极简与学习原则,环境都是手动搭建,公司的项目还是建议用 docker ,不然人在家中坐,坑从天上来。

这是没有前后端分离的部署方案,目前本博客采用了前后端分离,后端 laravel 仅仅提供 api ,前端部署到了 node 服务器上。

下面的命令是使用 root 用户执行的,如果权限不够,可以加上 sudo。

WEB 服务

安装 Caddy ,作为替代,可以使用 Nginx 。Caddy 小巧轻便,配置简单易上手,而且它可以帮你自动注册 https 证书。目前已经有 25.9 K 个 Star 。github 。它目前有 1.0 版本和 2.0 版本。

caddy v1

一条命令就安装完成,curl https://getcaddy.com | bash -s personal,参考Download Caddy 1.0。然后按照官方的指导来配置,参考github。跑完后,会生成一个可执行文件,/usr/local/bin/caddy。然后配置一下,大概是这几个步骤。

# 给权限
chown root:root /usr/local/bin/caddy
chmod 755 /usr/local/bin/caddy
setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

# 增加用户组
groupadd -g 33 www-data

# 增加用户
useradd \
-g www-data --no-user-group \
--home-dir /var/www --no-create-home \
--shell /usr/sbin/nologin \
--system --uid 33 www-data

# 弄一个文件夹放 Caddyfile
mkdir /etc/caddy
chown -R root:root /etc/caddy

# 弄一个文件夹放 ssl 证书
mkdir /etc/ssl/caddy
chown -R root:www-data /etc/ssl/caddy
chmod 0770 /etc/ssl/caddy

# 弄一个文件放配置,配置文件的写法后面结合 php 一起说
touch /etc/caddy/Caddyfile
chown root:root /etc/caddy/Caddyfile
chmod 644 /etc/caddy/Caddyfile

然后,把 caddy 做成一个系统服务,方便管理(也可以每一次去服务器上手动启动,手动狗头),下载 wget https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service,也可以手动去复制github

# 把下载下来的文件放到这里
cp caddy.service /etc/systemd/system/

# 给权限
chown root:root /etc/systemd/system/caddy.service
chmod 644 /etc/systemd/system/caddy.service

# 重新加载
systemctl daemon-reload

#启动
systemctl start caddy.service

# 开机自动启动
systemctl enable caddy.service

# 查看信息,出错的时候可以看
journalctl -f -u caddy.service

caddy v2

下载源码,git clone -b v2 "https://github.com/caddyserver/caddy.git",安装方法可参考Download Caddy 2.0。这里采用了源码安装,需要使用 go 来 build 。下载好之后,cd caddy/cmd/caddy/ ,编译一下。

也可以直接下载Release 2.0 beta 12

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

接下来部署到服务器,操作按照官网的来即可。把编译好的文件改名为 cacddy ,放到服务器 /usr/bin/ 目录(或者 /usr/local/bin也行)。caddy version 测试否有效,成功会输出 (devel)

创建一个名为 caddy 的组。

groupadd —system caddy

创建一个名为 caddy 的用户,该用户具有可写的主文件夹

useradd --system \
--gid caddy \
--create-home \
--home-dir /var/lib/caddy \
--shell /usr/sbin/nologin \
--comment "Caddy web server" \
caddy

新建文件 /etc/systemd/system/caddy.service,填入一下内容,把 caddy 做成一个服务。

[Unit]
Description=Caddy Web Server
Documentation=https://caddyserver.com/docs/
After=network.target

[Service]
User=caddy
Group=caddy

# Caddyfile 是 caddy 的配置文件,启动 caddy 服务之前需要先配置好
ExecStart=/usr/bin/caddy run —config /etc/caddy/Caddyfile —adapter caddyfile —resume —environ
ExecReload=/usr/bin/caddy reload —config /etc/caddy/Caddyfile —adapter caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

然后一堆命令,目前启动的时候会出错,找不到 /etc/caddy/Caddyfile。后面再来弄这个。

systemctl daemon-reload
systemctl enable caddy
systemctl start caddy
systemctl status caddy
journalctl -u caddy //查看 caddy 的输出信息
systemctl reload caddy //重新加载配置
systemctl stop caddy

到这里,web 服务已经弄好。

安装 php 以及扩展

使用 apt search php7.3 可以搜索到对应的软件包,如果搜不到,需要添加一下源 add-apt-repository ppa:ondrej/php 。可能会提示你缺少software-properties-common ,可以跑 apt install software-properties-common安装一下。然后,更新一下apt update。再次搜索,可以看到对应的php7.3以及扩展,扩展可以选择需要的进行安装。扩展的安装也很简单,按照这个格式跑命令即可apt install php7.3-XXX

apt install php7.3 php7.3-fpm安装php 和 fpm。输入 php -v 可查看版本,输入 php -m 可以看到安装的扩展。

另外,如果想给 php 添加扩展,可以跑 php -i | grep extension_dir确认 PHP 扩展的默认安装位置。

到这里,把 php 安装好了。如何把 php 和 caddy 连接起来,到时候再说。

部署站点

域名解析

caddy 和 php 都安装好了,可以开始把它们搞到一起了。不过,在此之前需要把域名解析到服务器的 IP 上,我使用的是cloudflare,大概是这样的。

Caddyfile 编写

1.0 写出来大概是这样,参考官网示例

# 域名
yourdomain.com
# 首页入口
root /var/www/html

# 让 caddy 自动帮你注册 https 证书
tls [email protected]

# caddy 使用 9000 端口和 php 进行通信
fastcgi / 127.0.0.1:9000 php {
    index index.php
}

# 重写 url
rewrite {
    to {path} {path}/ /index.php?{query}
}

2.0 写出来大概是这样,参考官网示例

# 域名
yourdomain.com

# 首页入口
root * /var/www/html

encode gzip

# 让 caddy 自动帮你注册 https 证书
tls [email protected]

# caddy 使用 9000 端口和 php 进行通信
php_fastcgi 127.0.0.1:9000

更改监听

打开 vim /etc/php/7.3/fpm/pool.d/www.conf,找到 listen = /run/php/php7.3-fpm.sock 更改为 listen = 127.0.0.1:9000。因为上一步配置了 caddy 使用 9000 端口和 php 通信,所以这里 php 也需要监听 9000 端口。当然也可以使用默认的 php7.3-fpm.sock 进行通信,暂时不研究这个了。

访问网站

systemctl reload caddy重新加载配置,然后去到 /var/www/html(上面 Caddyfile 中配置的网站入口),新建一个文件 index.php,随便写点东西,比如 echo phpinfo(),打开网站,不出意外可以看到结果。如果出错了,可以使用 journalctl -u caddy 具体看一下是什么错误。

果然不出所料,失败,journalctl -u caddy看报错一堆,其中有一个是 80 端口被占用。lsof -i:80一看。

黑人,问号???? apache2 占用了 80 端口,我寻思着我也没装 apache2 啊,定是捆绑的流氓软件,另外问一句,谁给你的勇气,梁静茹吗??apt --purge remove apache2卸载之, apt autoremove清除余孽。再次访问。

到此为止,已经把 web 和 php 搞在一起了。

安装 mysql-server

跑就完事apt install mysql-server。输入 mysql 可以登录进去。

安全设置

可能需要做一些安全设置,跑 mysql_secure_installation,它会引导我们怎么做。

是否需要密码验证插件,不要,滚。

设密码。

移除匿名用户。

是否禁止 root 用户远程登录,根据需要来。

是否移除测试数据库,这个无所谓,高兴就好。

是否重新加载表权限,是的。

mysql -u root -p 登录,跑。

# 新建一个用户,用你喜欢的名字,一会 .env 中要用
CREATE USER 'nidemingzi'@'localhost' IDENTIFIED BY 'password';
# 授权
GRANT ALL PRIVILEGES ON *.* TO 'nidemingzi'@'localhost' WITH GRANT OPTION;

# 重新加载权限
FLUSH PRIVILEGES;

上线

现在要做的是把本地开发好的项目,上传到服务器。有很多方式,fpt 上传、用 U 盘拷贝(手动狗头)、scp 拷贝等等。我这里使用 git ,毕竟 git 香。

安装 git

跑就完事 apt install gitgit —veresion可查看版本。

初始化仓库

新建目录 /var/www/blog用于放项目文件,新建目录/var/www/blog.git作为 git 仓库。cd /var/www/blog.git,执行 git init —bare把当前目录初始化为一个 git 仓库。你可以用自己喜欢的目录。

设定 hooks

当把项目文件推到 git 仓库的时候,可以使用 git hooks 把项目文件放置到 blog 目录下。cd /var/www/blog.git/hookstouch /var/www/blog.git/hooks/post-receive,填入

#!/bin/bash
git —work-tree=/var/www/blog —git-dir=/var/www/blog.git checkout -f

chmod +x post-receive ,给 post-receive 添加权限,使之可以移动文件。

post-receive 这个钩子,会在 git push 之后执行,参考,这里使用它把我们的代码放置到网站目录下。还可以用它来做更多的是,例如跑composer、重启队列等。

推送

在本地跑 git remote add blog ssh://[email protected]/var/www/blog.git,添加一个名为 blog 的 remote 。可以使用 git remote show blog查看信息。然后,git push blog master,把文件推上去。这时候去到服务器 cd /var/www/blog,应该可以看到项目了。

常规配置

  • 配置 env 文件。 cp .env.example .env
  • composer 如果没有 composer ,就安装一下,apt install composer。由于上面安装 php 的时候,很多扩展没安装,跑 composer 的时候,可能会提示依赖于某个扩展,对照着报错,跑 apt install php7.3-XXX 一一安装即可。然后再次 composer install

如果遇到缺少 dom 扩展,需要安装 xml 扩展。

  • php artisan key:generate
  • php artisan storage:link

配置数据库

mysql -u root -p 登录,CREATE DATABASE blog; 新建数据库,这里 blog 应该和你的 .env 文件中填写的 DB_DATABASE 匹配。

如果提示缺少 drive ,需要跑 apt install php7.3-mysql 。 安装好数据库之后,就可以执行数据库迁移了 php artisan migrate

如果提示 Access denied for user 'root'@'localhost',可能需要把 .evn 中的 DB_HOST 改成 localhost。

supervisor

如果有跑队列的需求,可以配一下。参考官方文档supervisor

安装apt install supervisor,新建 /etc/supervisor/conf.d/laravel-worker.conf,填入以下内容。

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
# 下一行的 redis 应该和 .env 文件中的 QUEUE_CONNECTION 保持一致
command=php /var/www/blog/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/logs/supervisor/worker.log

然后跑就完事。

supervisorctl reread //加载配置
supervisorctl update //更新
supervisorctl start laravel-worker:* //启动
supervisorctl restart laravel-worker:* //重启
supervisorctl status //查看状态

redis

跑就完事 apt install redis-server。如果你的服务器不支持 IPv6,redis 可能就跑不起来,需要改下配置。因为 redis 默认除了绑定本机 IPv4 地址,还绑定了 IPv6,::1 就是代表了本机的 IPv6 地址,是 0:0:0:0:0:0:0:1 的缩写。

# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-bind 127.0.0.1 ::1
+bind 127.0.0.1

修改 Caddyfile

这里用 1.0 版本,2.0 毕竟还是开发版。

# 域名
yourdomain.com
# 首页入口,改成自己的目录
-root /var/www/html
+root /var/www/blog

重启一下 web 服务systemctl restart caddy,然后网站就可以访问了。

独奏团
青风百里 编码和设计