起因

本来博客是一直使用github pages进行部署的,但是国内的github.io太慢了,并且刚好在年末促销买了一台一年的华为云服务器,就想试一试。

在云服务器上安装nginx

sudo apt-get install nginx

nginx的常用命令

# 启动 Nginx 服务
sudo systemctl start nginx

# 停止 Nginx 服务
sudo systemctl stop nginx

# 重新启动 Nginx 服务(用于配置更改后使更改生效)
sudo systemctl restart nginx

# 重新加载 Nginx 配置文件(不中断服务)
sudo systemctl reload nginx

# 检查 Nginx 服务的状态
sudo systemctl status nginx

# 测试配置文件的正确性(在实际重新加载或重启 Nginx 之前)
sudo nginx -t

# 显示 Nginx 的版本和配置选项
nginx -v

# 设置 Nginx 开机自动启动
sudo systemctl enable nginx

# 禁用 Nginx 开机自动启动
sudo systemctl disable nginx

# 查看 Nginx 的错误日志(路径可能根据安装和配置有所不同)
sudo tail -f /var/log/nginx/error.log

# 查看 Nginx 的访问日志(路径可能根据安装和配置有所不同)
sudo tail -f /var/log/nginx/access.log

把本地的public/下的文件复制到云服务器上

nginx默认的起始欢迎页面在/var/www/html/index.nginx-debian.html;

而我们可以把博客的public文件夹放在/var/www/sites/下面,即博客的index在/var/www/sites/public/index.html

# 本地执行
scp -r public username@hostname:~/mysites
ssh username@hostname
# 云服务器上
sudo cp -r mysites /var/www/mysites

配置nginx

nginx的配置文件在/etc/nginx/site-available/,在这个文件夹下有一个默认的配置文件default。

把default复制一份,再进行修改。

主要修改就是sever_name部分,改为自己的域名;同时把root的路径指向包含博客index.html的目录

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/mysites/public;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name sirius1y.me;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #       deny all;
        #}
}

然后使用IP和域名进行访问就OK了。记得启动nginx服务器就是了:sudo systemctl start nginx

实现自动部署

我想要实现在本地写完笔记之后先把源码上传到dev-hugo上,并且部署到master分支上,同时把public部署到nginx上。

原来的脚本,实现了前两个功能,并且能够自动添加更改的文件的提交信息。

# 定义FILES变量
FILES=$(cd /home/yoho/projects/blogs/hugo/content/posts/Notes && git status --porcelain | awk '{print $2}' | paste -sd, -)

# 同步笔记到sirius2alpha/Notes
echo ------------------------start---同步笔记到sirius2alpha/Notes------------------------
cd /home/yoho/projects/blogs/hugo/content/posts/Notes
git add .
git commit -m "update: $FILES"
git pull
git push
echo ------------------------end---同步笔记到sirius2alpha/Notes------------------------

# sync dev-hugo branch 
echo ------------------------start---sync dev-hugo branch------------------------------
cd /home/yoho/projects/blogs/hugo
git add .
git commit -m "update: $FILES"
git pull
git push
echo ------------------------end---sync dev-hugo branch------------------------------


# build
cd ~/projects/blogs/hugo
hugo

# master branch only push
echo ------------------------start---master branch-------------------------------------
cd ~/projects/blogs/hugo/public
git add .
git commit -m "feat: $FILES"
git push origin master
echo ------------------------end---master branch-------------------------------------


# 部署到 Nginx 服务器,和/etc/nginx/sites-available/mysite中的root一致
NGINX_SERVER_PATH="/var/www/mysites"

# 使用 rsync 同步 public 目录到 Nginx 服务器的相应目录
rsync -av --delete -e "ssh -p 22" ~/projects/blogs/hugo/public/ root@1.94.126.139:$NGINX_SERVER_PATH

# 重启 Nginx 服务
ssh root@1.94.126.139 "sudo systemctl reload nginx"

rsync -av --delete ~/projects/blogs/hugo/public/ $NGINX_SERVER_PATH 命令的意思是:

  • rsync: 这是一个非常强大的文件和目录同步工具,广泛用于备份和镜像目的。
  • -av: 这是两个选项的组合。
    • -a--archive 表示启用归档模式,这会保留符号链接、设备、属性、权限、所有权等信息,并且会递归复制目录。
    • -v--verbose 表示详细模式,会显示关于正在执行的同步操作的更多信息。
  • --delete: 这个选项会在同步过程中删除目标目录中存在而源目录中不存在的文件。这确保目标目录是源目录的精确镜像,包括移除已经在源目录中被删除的文件。
  • ~/projects/blogs/hugo/public/: 这是源目录的路径,即 rsync 命令要复制的文件和目录所在的位置。在这个例子中,它指的是 Hugo 网站生成的公共(public)目录。
  • $NGINX_SERVER_PATH: 这是目标目录的路径,即文件将被同步到的位置。这个变量应该被设置为你的 Nginx 服务器上用于托管网站的目录的路径。例如,它可能是 /var/www/mysite

总的来说,这个命令将把 ~/projects/blogs/hugo/public/ 目录中的内容同步到 $NGINX_SERVER_PATH 指定的目录中,同时保持文件权限和结构不变,并删除目标目录中那些在源目录不存在的文件。这个命令通常用于确保网站的内容是最新的,同时移除不再需要的文件。