编程笔记

lifelong learning & practice makes perfect

nginx

Nginx

高性能的HTTP和反向代理服务器,Nginx 的主要功能:

  • HTTP 服务器:Nginx 可以作为独立的 HTTP 服务器,提供静态和动态内容的托管。
  • 反向代理:Nginx 可以作为反向代理服务器,将客户端请求转发到后端服务器,并将响应返回给客户端。
  • 负载均衡:Nginx 支持多种负载均衡算法,如轮询、加权轮询和 IP 哈希,以实现请求的分发和服务器资源的优化利用。
  • 邮件代理:Nginx 可以作为邮件代理服务器,支持 IMAP、POP3 和 SMTP 协议。
  • 缓存:Nginx 支持 HTTP 缓存,可以缓存静态和动态内容,以提高性能和减少服务器负载。
  • 安全性:Nginx 提供了多种安全功能,如访问控制、DDoS 保护和 SSL/TLS 加密。

配置

反向代理

每个站点在 conf.d目录下新增一个类似ssl.conf的配置文件,这样做的好处是将每个站点的配置单独放在一个文件,方便区分和修改.

1
2
3
ls -al /etc/nginx/conf.d/
total 12K
-rw-r--r-- 1 root root 1.5K Sep 12 10:08 ssl.conf

这样启用的原理是(debian类的linux)nginx的默认配置(/etc/nginx/nginx.conf)有这样一行,即会将该目录下以conf做后缀名的配置文件
都包含在内

1
include /etc/nginx/default.d/*.conf;

样例配置如下,这套配置默认启用ssl,将证书放在/etc/nginx/ssl目录下,最好是范域名证书,这样所有站点都可以使用同一份证书文件
同时开启了http自动跳转https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
server {
# SSL 默认访问端口号为 443
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 请填写绑定证书的域名
server_name demo.example.com;

# 请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/ssl/fullchain.pem;
# 请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

ssl_session_timeout 5m;
# 请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
# 请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=63072000" always;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}

server {
listen 80;
# 请填写绑定证书的域名
server_name demo.example.com;

# 把 HTTP 的域名请求转成 HTTPS
location / {
return 301 https://$host$request_uri;
}
}

密码认证/basic auth

添加这段配置,当访问/admin路径时需要输入密码才允许继续

1
2
3
4
5
location /admin {
auth_basic "Please input password"; #这里是验证时的提示信息
auth_basic_user_file /etc/nginx/passwd/admin_passwd;
proxy_pass http://localhost:9090;
}

nginx密码格式为 “用户名:加密密码”,可以使用htpasswd工具生成密码.

htpasswd 工具支持多种加密算法,包括 MD5、bcrypt、CRYPT 和 SHA。建议使用更安全的算法,如 bcrypt

1
2
# -c 表示创建密码文件
sudo htpasswd -c /etc/nginx/passwd/admin_passwd admin

管理面板

  • nginx-ui,和使用nginx配置差不多,只是提供了UI方便操作,同时有一些工具如ssl证书管理,第三方认证等
  • Nginx Proxy Manager,有UI,支持ssl证书管理,但和nginx配置有些不同,需要掌握新增的概念不点不太友好

references

  1. template
  2. auto generate
  3. ningx-ui,开源nginx管理面板

欢迎关注我的其它发布渠道