记录从零开始使用nginx部署网站

2026-01-13 | 类别:服务器部署 (Deployment)


使用nginx的原因是,我的网站太低级了,没有使用到任何框架,是纯粹的原始html,css和js的实现。

没有依赖模块,也就意味着不需要用npm安装任何东西。

权当一次练手项目,体验原始人部署网站的感觉。

依赖:

  • 一个有公网ip的linux系统云服务器
  • 一个准备好的网站内容的GitHub仓库
  • 一个域名(可选)

利用github部署私钥部署网站

因为我的网站相关的文件都在一个github的私有仓库中存储,而我又不想直接在云服务器上登录我的GitHub账户,因此需要以设置部署私钥的形式给服务器该私有仓库的访问权限

服务器端生成ssh密钥

创建ssh文件

如果已经有~/.ssh文件就不需要新建了,因为这个服务器是全新的,因此不存在这个文件夹

# 1. 回到家目录
cd ~
# 2. 创建 .ssh 目录 (-p 表示如果已存在就不报错)
mkdir -p .ssh
# 3. 赋予权限:只有你自己(owner)能读写和进入该目录,别人完全进不去
# 这一步如果不做,后面可能会报错
chmod 700 .ssh
创建一个部署博客专用密钥

如果提示设置密码可以直接留空回车跳过,这个密钥我们不会给太重要的权限,只是为了未来设置自动拉取仓库更新使用

# 进入目录
cd ~/.ssh
# 生成密钥 
ssh-keygen -t ed25519 -C "blog_deploy_key" -f github_blog_key

查看并复制生成的公钥

cat ~/.ssh/github_blog_key.pub

设置GitHub仓库的部署私钥

我们可以直接通过仓库中的设置-->安全-->部署密钥处添加服务器的公钥

Github Deploy Keys

填写之前在服务器上生成的公钥,点击添加密钥,注意不要勾选允许写入权限。

Add Key

随后理论上该服务器就可以免密码的pull这个仓库的更新了。

回到服务器上测试下

在服务器上ssh的配置文件中设置用于ssh github的密钥

vi ~/.ssh/config

在里面添加以下内容

# Blog Project specific key
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github_blog_key
  IdentitiesOnly yes

保存退出并修改权限

chmod 600 ~/.ssh/config

测试链接

ssh -T git@github.com

如果看到以下字样说明配置成功

Hi ******! You've successfully authenticated, but GitHub does not provide shell access.

安装并配置nginx服务

安装nginx

登陆服务器

# 1. 更新软件源
sudo apt update
# 2. 安装 Nginx
sudo apt install nginx
# 3. 启动并查看状态
sudo systemctl start nginx
sudo systemctl status nginx

如果看到绿色的 active (running),说明安装成功了。 此时在浏览器输入服务器的 IP 地址,应该能看到一个 "Welcome to nginx!" 的默认页面。

如果看不到则说明可能云服务器运营商的后台可能没有开启对应的端口。

开启端口访问权限

我这使用的是阿里云

进入该服务器的网络与安全组,点击添加规则

Aliyun Security Group

随后添加http和https的权限,点击确定

Add Rules

配置nginx并完成初次pull

新建一个存放网站的目录:

# 创建目录 (名字随便起,比如 myblog)
sudo mkdir -p /var/www/myblog

# 赋予权限 (这一步很重要,否则 Nginx 读不到文件报 403 错误)
# 将所有权给当前用户 (方便上传)
sudo chown -R $USER:$USER /var/www/myblog
# 确保其他人有读取权限
sudo chmod -R 755 /var/www/myblog

创建一个新的配置文件:

sudo vi /etc/nginx/conf.d/myblog.conf

填入以下内容

server {
    # 监听 80 端口 (HTTP)
    listen 80;

    # 这里填你的域名 (如果你还没解析好,先填 localhost 或 服务器IP)
    server_name www.yourdomain.com 服务器IP; 

    # 指定网站文件的根目录 (刚才创建的那个)
    root /var/www/myblog;

    # 默认打开哪个文件
    index index.html;

    location / {
        # 尝试寻找文件,找不到就报 404
        try_files $uri $uri/ =404;
    }
}

检查配置并重启

# 检查刚才写的配置有没有语法错误
sudo nginx -t 
# 如果显示 successful,则重启 Nginx
sudo systemctl reload nginx

初次pull

git clone git@github.com:******/******.git /var/www/myblog

如果pull成功就万事大吉了。用这个nginx有个好处就是可以无痛热更新。

想要更新网页并不需要重启服务,直接修改对应路径文件夹下的文件即可。

因此可以设置一个定时任务,每天从仓库获得更新

配置自动pull定时任务

新建一个一键pull的脚本

vim ~/deploy.sh

填入以下内容

#!/bin/bash

# 定义颜色,为了好看(绿色成功,红色失败)
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 1. 打印开始信息
echo -e "${GREEN}==> Starting deployment...${NC}"

# 2. 进入网站目录
cd /var/www/myblog || { echo -e "${RED}Directory not found!${NC}"; exit 1; }

# 3. 拉取最新代码
echo -e "Pulling latest changes from GitHub..."
output=$(git pull origin main 2>&1) # 假设主分支是 main,如果是 master 请修改这里

# 4. 检查是否成功
if [ $? -eq 0 ]; then
    echo -e "${GREEN}==> Success! Your blog is now up to date.${NC}"
    # 打印 git pull 的结果(比如更新了哪些文件)
    echo "$output" 
else
    echo -e "${RED}==> Error: Git pull failed!${NC}"
    echo "$output"
fi

保存退出

添加可执行权限

chmod +x ~/deploy.sh

尝试运行

./deploy.sh

新建定时任务

crontab -e

如果首次新建,会提示选择一个编辑器

这里我选择2 vim 编辑器

随后在文件末尾填写一行新的规则(注意将*替换为用户名)这里所有路径都需要填写绝对路径,且不能用~省略

0 3 * * * /home/***/deploy.sh >> /home/***/deploy.log 2>&1

0 3 * * *表明每天3点运行一次

最后保存退出

补充:如果出现找不到git的情况,则需要给deploy.sh脚本最前面加上

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

以保证可以正确访问到

额外内容

配置域名(可选)

去到购买域名的服务商处配置解析记录

我这里是使用的阿里云,同时也开启了边缘安全加速ESA

因此解析记录需要在ESA的站点管理中配置

点击新增

Add Record

根据需要填写,我这里添加的是@和www,并填写服务器ip

Record Details

www:将域名解析为 www.example.com

@:直接解析主域名 example.com

添加完成后在 服务器端配置文件对应位置修改填写域名即可

sudo vi /etc/nginx/conf.d/myblog.conf
server_name www.yourdomain.com yourdomain.com;

配置自动更新的免费ssl证书(可选)

需要绑定有域名才可以

安装Certbot
# 更新软件源
sudo apt update

# 安装 Certbot 和它的 Nginx 插件
sudo apt install certbot python3-certbot-nginx
启动一键配置
sudo certbot --nginx

接下来会出现交互界面,按提示操作(只需做一次):

  1. Enter email address: 输入你的邮箱(用于接收证书快过期的提醒,填真实的)。
  2. Terms of Service: 输入 Y 同意协议。
  3. Share email: 输入 N(不想分享邮箱给 EFF 基金会)。
  4. Select names: 它会列出你 Nginx 配置里写的域名)。
    • 直接按回车(选择所有域名)。
  5. 稍等几秒 如果显示 Successfully received certificate,说明成功了!

Certbot 会自动帮你把 Nginx 的配置文件改好,加上 SSL 相关的代码。

看到Congratulations!字样说明成功了

可以打开配置文件检查下是否自动应用了配置

Success

刚刚配置完SSL后突然网站的访问量就上来了,似乎很多爬虫从发布证书的网站上得到了我的网站的信息。

安全管理

既然突然来了一堆访问量,就简单检查下访问量的来源以及是否存在不安全的地方。

sudo tail -f /var/log/nginx/access.log

日志如下,ai表示这是bot在检测网站的安全性。

165.227.84.14 - - [14/Jan/2026:00:05:15 +0800] "GET /.env HTTP/1.1" 404 134 "-" "Mozilla/5.0 (l9scan/2.0.733323e26333e2030323e2130313; +https://leakix.net)"
138.68.86.32 - - [14/Jan/2026:00:05:17 +0800] "GET /s/733323e26333e2030323e2130313/_/;/META-INF/maven/com.atlassian.jira/jira-webapp-dist/pom.properties HTTP/1.1" 404 134 "-" "Mozilla/5.0 (l9scan/2.0.733323e26333e2030323e2130313; +https://leakix.net)"
165.227.84.14 - - [14/Jan/2026:00:05:17 +0800] "GET /.git/config HTTP/1.1" 200 275 "-" "Mozilla/5.0 (l9scan/2.0.733323e26333e2030323e2130313; +https://leakix.net)"
138.68.86.32 - - [14/Jan/2026:00:05:18 +0800] "GET /config.json HTTP/1.1" 404 134 "-" "Mozilla/5.0 (l9scan/2.0.733323e26333e2030323e2130313; +https://leakix.net)"
165.227.84.14 - - [14/Jan/2026:00:05:18 +0800] "GET /s/733323e26333e2030323e2130313/_/;/META-INF/maven/com.atlassian.jira/jira-webapp-dist/pom.properties HTTP/1.1" 404 134 "-" "Mozilla/5.0 (l9scan/2.0.733323e26333e2030323e2130313; +https://leakix.net)"
165.227.84.14 - - [14/Jan/2026:00:05:19 +0800] "GET /config.json HTTP/1.1" 404 134 "-" "Mozilla/5.0 (l9scan/2.0.733323e26333e2030323e2130313; +https://leakix.net)"

其中GET /.git/config HTTP/1.1" 200 直接成功请求到了.git的config文件其实就是重大安全漏洞。不应该给予访问者.git的访问权限,因为所有版本记录其实都在该文件下记载。如果可以访问这个目录就直接可以还原出整个git仓库的操作记录,如果直接失误上传过key,这个key就完全不能要了。

因此紧急修改config文件,主动拒绝掉这种隐藏文件的访问权限

sudo vi /etc/nginx/conf.d/myblog.conf

此时应该会发现,config文件和之前不同了

Cerbot在conf文件后面编辑新添加了一个server{ }的部分

不要修改它新添加的部分,那部分是用来验证ssl和http强制跳转https的

在上一个location字段下面再添加一个location字段

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

此时新添加的这段位置应该是这样的

    location / {
        # 尝试寻找文件,找不到就报 404
        try_files $uri $uri/ =404;
    }
    
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    listen 443 ssl; # managed by Certbot

随后验证格式并重启服务

sudo nginx -t
sudo systemctl reload nginx