ubuntu安装nginx
Nginx的默认配置文件通常位于/etc/nginx/nginx.conf,以及在/etc/nginx/sites-available/和/etc/nginx/sites-enabled/目录下的站点特定配置文件。你可以根据需要编辑这些文件来自定义你的网站配置。
使用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/目录下的站点特定配置文件。
- sites-available/
存放所有可用的站点配置文件(但不会被 Nginx 实际加载)。 - 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),比如:
- 默认使用 iptables(或 nftables)
✅ 支持长期封禁
❗ 但服务器重启后规则会丢失(除非你保存 iptables 规则)
所以实际封禁时间 ≤ 服务器连续运行时间 - 使用 systemd 或 firewalld
行为类似,重启后可能失效 - 使用持久化后端(如写入 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 限制 已经足够。
更多推荐



所有评论(0)