使用apt安装nginx

sudo apt update
sudo apt install nginx

检查 Nginx 服务状态

sudo systemctl status nginx

启动Nginx:

sudo systemctl start nginx

测试nginx

curl http://localhost

配置Nginx(可选)

Nginx的默认配置文件通常位于/etc/nginx/nginx.conf,以及在/etc/nginx/sites-available/和/etc/nginx/sites-enabled/目录下的站点特定配置文件。

  1. sites-available/
    存放所有可用的站点配置文件(但不会被 Nginx 实际加载)。
  2. sites-enabled/
    存放已启用的站点配置 —— 实际上是 sites-available/ 中对应文件的符号链接(symbolic link)。
    通过下面命令,
    ls -l /etc/nginx/sites-enabled/
    输出类似
    lrwxrwxrwx 1 root root 34 Nov 4 10:11 default -> /etc/nginx/sites-available/default
    开头的 l 表示这是一个 符号链接(link)
    default -> /etc/nginx/sites-available/default 表示它指向 sites-available 中的同名文件

/etc/nginx/sites-available/default 配置的默认站点为 /var/www/html

你可以根据需要编辑这些文件来自定义你的网站配置。例如,编辑默认的站点配置文件:
sudo nano /etc/nginx/sites-available/default
修改完成后,记得重启Nginx以应用更改:
sudo systemctl restart nginx

卸载Nginx(如果需要)

sudo apt remove nginx nginx-common

然后,你可以选择移除配置文件:

sudo rm -r /etc/nginx /usr/share/nginx /var/lib/nginx /var/log/nginx /var/www/html /etc/logrotate.d/nginx /etc/mime.types /etc/alternatives/nginx /etc/init.d/nginx /usr/sbin/nginx-debug /usr/sbin/nginx /usr/libexec/path_helper/nginx /usr/libexec/path_helper+ /usr/share/man/man8/nginx.8.gz /usr/share/man/man8+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/doc-base+ /usr/share/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /var/+ /

增加一个新站点:Nginx 在 端口 8637 上提供服务,网站文件放在 /var/www/yyh 目录下
步骤 1:创建网站目录(如果还没建)

sudo mkdir -p /var/www/yyh

然后把你的 index.html 等文件放进去,例如:

sudo cp -r ~/your-project/* /var/www/yyh/

确保权限正确:

sudo chown -R www-data:www-data /var/www/yyh
sudo chmod -R 755 /var/www/yyh

步骤 2:创建 Nginx 站点配置文件
新建一个配置文件(比如叫 yyh):

sudo nano /etc/nginx/sites-available/yyh

粘贴以下内容:

server {
    listen 8637;
    server_name _;  # 匹配任意域名或 IP

    root /var/www/yyh;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    # 可选:允许跨域(如果你的 JS 有 fetch 等请求)
    # add_header Access-Control-Allow-Origin *;
}

注意:端口 8637 是自定义端口,不属于特权端口(<1024),所以 Nginx 普通用户也能监听。

步骤 3:启用这个站点

sudo ln -s /etc/nginx/sites-available/yyh /etc/nginx/sites-enabled/

步骤 4:测试配置 & 重载 Nginx

# 检查语法是否正确
sudo nginx -t

# 如果显示 "syntax is ok",就重载
sudo systemctl reload nginx

步骤 5:开放防火墙端口(重要!)
如果你用的是 UFW(Ubuntu 默认防火墙):

sudo ufw allow 8637/tcp

如果是 云服务器(腾讯云、阿里云等):
登录云控制台
找到「安全组」或「防火墙规则」
添加入站规则:允许 TCP 端口 8637
🌐 否则,外部(比如你的手机)无法访问这个端口!

验证是否成功(在服务器上测试)

curl http://localhost:8637

加个简单密码(HTTP Basic Auth)—— 强烈推荐!

# 安装 apache2-utils(用于生成密码文件)
sudo apt install apache2-utils

# 创建用户(比如用户名 yyh)
htpasswd -c /path/.htpasswd username	创建新文件,并添加第一个用户(⚠️会覆盖已有文件!)
htpasswd /path/.htpasswd username	向已有文件追加新用户(或修改已有用户的密码)

sudo htpasswd -c /etc/nginx/.htpasswd yyh
# 按提示输入密码

# 修改你的 Nginx 配置
sudo nano /etc/nginx/sites-available/yyh

sudo htpasswd /etc/nginx/.htpasswd yyh2

在 location / 或 server 块中加入:

auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;

完整示例:

server {
    listen 8637;
    root /var/www/yyh;
    index index.html;
    
   #  关键:强制指定 charset 为 UTF-8,不然会乱码
    charset utf-8;

    location / {
        auth_basic "Restricted Access";
        auth_basic_user_file /etc/nginx/.htpasswd;
        try_files $uri $uri/ =404;
    }
}

重载生效:

sudo nginx -t && sudo systemctl reload nginx

用 Fail2ban 自动封禁暴力破解 IP(进阶)
安装 Fail2ban 监控 Nginx 日志,多次失败后自动封 IP:

sudo apt install fail2ban

创建配置:

sudo nano /etc/fail2ban/jail.local

添加:

[nginx-http-auth]
enabled = true
port = 8637
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 100d

这样,3 次输错密码就封 IP 100 天,极大提升安全性。

需要重启fail2ban

sudo systemctl restart fail2ban

Fail2ban 支持使用 d(天)、h(小时)、m(分钟)、s(秒)作为时间单位,非常直观:

写法 含义
bantime = 600 600 秒(默认单位是秒)
bantime = 10m 10 分钟
bantime = 2h 2 小时
bantime = 7d 7 天
bantime = 100d 100 天

⚠️ 但要注意:是否真的能封 100 天?
这取决于你使用的封禁后端(ban action),比如:

  1. 默认使用 iptables(或 nftables)
    ✅ 支持长期封禁
    ❗ 但服务器重启后规则会丢失(除非你保存 iptables 规则)
    所以实际封禁时间 ≤ 服务器连续运行时间
  2. 使用 systemd 或 firewalld
    行为类似,重启后可能失效
  3. 使用持久化后端(如写入 hosts.deny 或自定义脚本)
    可实现真正持久封禁,但需额外配置

✅ 推荐做法
如果你希望长期封禁恶意 IP,可以:

方案一:用 bantime = -1 表示“永久封禁”

bantime = -1

Fail2ban 会一直封,直到你手动解封
解封命令为:

sudo fail2ban-client set nginx-http-auth unbanip x.x.x.x

方案二:配合 findtime 和 maxretry 防误伤

[nginx-http-auth]
enabled = true
port = 8637
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
findtime = 10m   # 10分钟内错3次就封
bantime = 100d   # 封100天

方案三:定期保存 iptables 规则(针对重启失效)

# Ubuntu 安装 iptables-persistent
sudo apt install iptables-persistent

# 手动保存当前规则
sudo netfilter-persistent save

这样重启后封禁规则不会丢失。

如何查看当前被封的 IP?

# 查看 nginx-http-auth 监狱中的封禁列表
sudo fail2ban-client status nginx-http-auth
# 1. 先清空旧日志(可选)
sudo truncate -s 0 /var/log/nginx/error.log
# 查看nginx密码错误日志
vi -R /var/log/nginx/error.log
#或
sudo tail /var/log/nginx/error.log

如果发现密码错误次数达到了,但是没有封禁,可能是
Fail2ban 没有从 /var/log/nginx/error.log 读取日志,而是试图从 systemd journal 读取(但 Nginx 错误日志默认不进 journal)。

你看这一行:

ubuntu@VM-4-3-ubuntu:~$ sudo fail2ban-client status nginx-http-auth
Status for the jail: nginx-http-auth
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=nginx.service + _COMM=nginx
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

`- Journal matches: _SYSTEMD_UNIT=nginx.service + _COMM=nginx 这说明你的 nginx-http-auth jail 配置成了使用 systemd journal,而不是你指定的 logpath = /var/log/nginx/error.log。

根本原因
在较新版本的 Fail2ban(尤其是 Ubuntu 22.04+),如果系统启用了 systemd journal,Fail2ban 会优先使用 journalmatch 而忽略 logpath —— 即使你写了 logpath!

而 Nginx 的 error log 默认只写入文件,不写入 journal,所以 Fail2ban 根本“看不到”这些 password mismatch 记录。

解决方案:强制 Fail2ban 使用文件日志(禁用 journal)
步骤 1:修改 jail 配置,显式关闭 journal
编辑你的配置:
sudo vi /etc/fail2ban/jail.local
确保内容如下(关键:加上 backend = auto 或 backend = polling):

[nginx-http-auth]
enabled = true
port = 8637
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
backend = auto
maxretry = 3
findtime = 60
bantime = -1

backend = auto 会强制 Fail2ban 使用文件监控(inotify 或 polling),而不是 journal。
步骤 2:重启 Fail2ban(reload 可能不够)

sudo systemctl restart fail2ban

步骤 3:验证 jail 是否使用文件日志

sudo fail2ban-client get nginx-http-auth logpath

应输出:

['/var/log/nginx/error.log']

考虑替代方案(长期),目前不需要
如果这是重要系统,建议未来迁移到:

登录页面 + Session 认证(如用简单 PHP/Node.js 实现)
Token 认证
反向代理 + OAuth(如 Authelia)
但对静态页面来说,HTTP Basic Auth + 强密码 + IP 限制 已经足够。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐