Skip to content

nginx

安装

https://nginx.org/en/linux_packages.html#Debian

指令

sh
# 配置文件检测
$ nginx -t
$ nginx -s [start|reload|stop|quit]
$ systemctl start nginx

virt container

sh
 $ 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

文件下载服务

sh
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 文件来验证用户身份,限制对特定资源的访问。

sh
# 安装
$ 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)确保数据在传输过程中未被篡改。

工作原理

握手阶段: 客户端和服务器协商加密算法、交换密钥并验证证书。

主要步骤:

  1. 客户端发送 ClientHello,包含支持的 TLS 版本和加密套件。
  2. 服务器回复 ServerHello,选择 TLS 版本和加密套件,并发送服务器证书。
  3. 客户端验证证书,生成预主密钥并使用服务器的公钥加密后发送。
  4. 服务器使用私钥解密预主密钥,双方生成会话密钥。
  5. 握手完成,开始加密通信。

数据传输阶段:使用会话密钥对数据进行加密和解密

证书类型

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/

sh
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;
}

启用

sh
$ 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

sh
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>;
}

测试

sh
$ 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 参数。

sh
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

conf
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

内置变量

https://nginx.org/en/docs/http/ngx_http_core_module.html