nginx
安装
https://nginx.org/en/linux_packages.html#Debian
指令
# 配置文件检测
$ nginx -t
$ nginx -s [start|reload|stop|quit]
$ systemctl start nginx
virt container
$ docker run -d --name nginx -p 80:80 -p 443:443 \
-v [your path]/data:/data \
-v [your path]/log:/var/log/nginx/ \
-v [your path]/nginx.conf:/etc/nginx/nginx.conf \
-v [your path]/conf.d:/etc/nginx/conf.d nginx:1.22.1
文件下载服务
location ^~ /download {
alias /data/download;
autoindex on;
autoindex_exact_size off;
autoindex_localtine on;
default_type application/octet-stream;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}
.htpasswd
htpasswd
是一个用于创建和更新 .htpasswd
文件的工具,通常用于 HTTP 基本认证。 Nginx 和 Apache 等 Web 服务器可以使用 .htpasswd
文件来验证用户身份,限制对特定资源的访问。
# 安装
$ apt install apache2-utils
# 创建 .htpasswd 文件
$ htpasswd -c /etc/nginx/.htpasswd <username>
# 添加/修改
$ htpasswd /etc/nginx/.htpasswd <username>
# 删除
$ htpasswd -D /etc/nginx/.htpasswd <username>
ssl
SSL(Secure Sockets Layer)是一种用于加密网络通信的安全协议,现已被其继任者 TLS(Transport Layer Security)取代,但人们仍习惯称之为 SSL。SSL/TLS 的主要目的是在客户端和服务器之间建立安全的通信通道,确保数据在传输过程中不被窃取或篡改。
- 通过加密算法保护数据,防止中间人攻击(MITM)。
- 使用数字证书验证服务器(和客户端)的身份,防止伪装攻击。
- 使用消息认证码(MAC)确保数据在传输过程中未被篡改。
工作原理
握手阶段: 客户端和服务器协商加密算法、交换密钥并验证证书。
主要步骤:
- 客户端发送
ClientHello
,包含支持的 TLS 版本和加密套件。 - 服务器回复
ServerHello
,选择 TLS 版本和加密套件,并发送服务器证书。 - 客户端验证证书,生成预主密钥并使用服务器的公钥加密后发送。
- 服务器使用私钥解密预主密钥,双方生成会话密钥。
- 握手完成,开始加密通信。
数据传输阶段:使用会话密钥对数据进行加密和解密
证书类型
DV:验证域名所有权,适合个人网站。 OV:验证组织信息,适合企业网站。 EV:严格验证组织信息,浏览器地址栏会显示绿色的公司名称。
SSL/TLS 版本
- SSL 1.0/2.0/3.0 已过时,存在严重安全漏洞,不建议使用。
- TLS 1.0/1.1 逐渐淘汰,现代浏览器和服务器默认禁用。
- TLS 1.2/1.3 目前广泛使用的版本。
使用场景
- Web 服务器(Nginx、Apache)
- 邮件服务器(Postfix、Dovecot)
- 数据库(MySQL、PostgreSQL)
- API 和微服务(Tomcat)
申请
- 可在云管平台申请
- DV 单域名证书申请推荐裸域名(不加二级域名)。
- 持有者校验。DNS 需要根据申请要求添加一条配置。(通过后可删除)
- 审核时间:通常 15~60 min
配置
获取 pem/key 格式证书,上传到部署服务器。解压到 nginx 目录下的 conf 文件中。
如:nginx-1.21/conf/ali-ng-cert-dv/
server {
listen 443 ssl;
server_name <your domain>;
ssl_certificate ali-ng-cert-dv/<cert-file-name>.pem;
ssl_certificate_key ali-ng-cert-dv/<cert-file-name>.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
}
启用
$ nginx -t
$ systemctl restart nginx
# 或者
$ nginx -s reload
注意
xxx.pem":BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('xxx.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
- 相对路径:从 conf 目录下读取证书文件需要处于 conf 目录的子级,否则会报错。
- 绝对路径:不能处于 nginx 应用目录的子集,否则会报错。
推荐,相对路径!
80 跳转 443
server {
listen 80;
server_name <domain name>;
#rewrite ^(.*)$ https://$server_name$1 permanent;
#return 200 'host=$host, hostname=$hostname, uri=$uri, http_name=$http_name, request=$request, server_name=$server_name, server_port=$server_port\n;'
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name <domain name>;
}
测试
$ url <domain name>/path?params=xxx
NGINX Regular Expression Tester
https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester
FAQ
413 Request Entity Too Large
携带请求体超过默认配置,通过修改 client_max_body_size
参数。
http {
client_max_body_size 10m;
server {
client_max_body_size 10m;
location {
client_max_body_size 10m;
}
}
}
Response code was not 101: 400
支持 WebSocket
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Ref
nginx 正则匹配配置 - 正义的伙伴! - 博客园 (cnblogs.com)
配置文件结构
https://www.runoob.com/w3cnote/nginx-setup-intro.html
内置变量