Nginx 的组成
- nginx 二进制可执行文件: 由各模块源码编译出的一个文件
- nginx,conf 配置文件: 控制nginx 的行为
- access.log 访问日志: 记录每一条http请求信息
- error.log 错误日志: 定位问题
Nginx 版本发布情况
选择哪个版本 Nginx
编译适合自己的 Nginx
-
下载nginx nginx官网
-
各个目录介绍 auto CHANGES conf configure contrib html
- auto: 包含自动配置脚本和模板文件,用于生成配置文件和 Makefile。
- cc: 包含编译器相关的自动配置脚本。
- compat: 包含兼容性检查脚本。
- lib: 包含外部库的自动配置脚本。
- modules: 包含模块的自动配置脚本。
- opts: 包含编译选项的自动配置脚本。
- vars: 包含变量定义的自动配置脚本。
- build: 包含构建过程的脚本和文件。
- CHANGES: 记录版本更改历史。
- configure: 主要的配置脚本,用于生成 Makefile 和其他配置文件。
- conf: 包含示例配置文件。
- nginx.conf: 示例的 Nginx 主配置文件。
- contrib: 包含一些额外的工具和脚本。
- core: 包含核心模块的源代码。
- event: 事件处理模块的源代码。
- http: HTTP 处理模块的源代码。
- crypto: 包含加密相关的模块源代码。
- deps: 包含 Nginx 依赖的一些外部库的源代码。
- html: 包含默认的 HTML 文件,如错误页面。
- man: 包含 Nginx 的手册页。
- modules: 包含各种可选模块的源代码。
- http_*: HTTP 相关的模块。
- stream_*: 流处理相关的模块。
- patches: 包含补丁文件。
- README: 项目的基本信息和安装指南。
- scripts: 包含用于辅助开发和构建的脚本。
- thirdparty: 包含第三方库。
- tools: 包含一些辅助工具和测试脚本。
文件描述
- Makefile: 编译系统的主要 Makefile。
- src: 包含 Nginx 源代码的核心部分。
- core: 核心功能的实现。
- event: 事件驱动机制的实现。
- http: HTTP 协议处理的实现。
- mail: 邮件协议处理的实现。
- stream: TCP/UDP 流处理的实现。
- os: 操作系统相关代码。
- unix: Unix/Linux 特定代码。
- win32: Windows 特定代码。
其他重要文件
- LICENSE: 许可证文件,Nginx 使用的是 2-clause BSD license。
- NEWS: 发布新闻和更新说明。
- auto: 包含自动配置脚本和模板文件,用于生成配置文件和 Makefile。
-
Configure
-
中间文件介绍
-
编译
-
安装
Nginx 配置语法
http 、upstream、 server、location
- 配置文件由指令和指令块构成
- 每条指令以; 分号结,命令和参数间以空格符号分割
- 指令块以 {} 大括号将多条指令组织在一起
- include 语句允许组合多个配置文件以提升可维护性
- 使用 # 符号添加注释,提高可读性
- 使用 $符号使用变量
- 部分指令的参数支持正则表达式
Nginx 命令
- 格式: nginx -s reload
- 帮助: -? -h
- 使用指定的配置文件: -c
- 指定的配置指令: -g
- 指定的运行目录: -p
- 发送信号: -s
- 测试配置文件是否有语法错误: -t -T
- 打印nginx 的版本信息、编译信息: -v -V
kill -USR2 pid(nginx)
kill -WiNCH pid(nginx)
nginx 周日志切割
#!/bin/bash
# 定义日志文件路径
LOG_DIR="/var/log/nginx"
ACCESS_LOG="$LOG_DIR/access.log"
ERROR_LOG="$LOG_DIR/error.log"
# 定义备份目录
BACKUP_DIR="$LOG_DIR/backup"
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 获取当前日期
DATE=$(date +%Y%m%d)
# 备份日志文件
mv $ACCESS_LOG $BACKUP_DIR/access_$DATE.log
mv $ERROR_LOG $BACKUP_DIR/error_$DATE.log
# 通知 Nginx 重新打开日志文件
nginx -s reopen
# 删除旧的备份文件(保留最近 7 天的备份)
find $BACKUP_DIR -type f -name "*.log" -mtime +7 -exec rm -f {} \;
crontab -e
0 0 * * 0 /path/to/your/nginx_log.sh
nginx 搭建静态资源服务器
- 一个静态资源文件夹放到服务器目录
- 配置文件
location /{ alias static_folder/; ... }
- 可以开启gzip 压缩
用 nginx 搭建一个具备缓功能的反向代理服务
- proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path = off;
使用GoAcces 实现可视化并实时监控 access 日志
- 安装 GoAccess
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html --daemonize
/var/log/nginx/access.log:Nginx 访问日志文件路径。
/var/www/html/report.html:生成的报告文件路径。
--real-time-html:启用实时更新 HTML 报告。
--daemonize:以后台进程运行。
访问报告
确保 Nginx 配置了相应的虚拟主机来提供生成的报告文件。例如:
Copy code
server {
listen 80;
server_name yourdomain.com;
location /report.html {
alias /var/www/html/report.html;
}
}
然后,你可以通过浏览器访问 http://yourdomain.com/report.html 来查看实时更新的报告。
示例:完整的 GoAccess 命令
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html --daemonize --log-format=COMBINED
从网络原理来看 SSL 安全协议
ISO/OSI 七层模型 |
---|
物理层 |
数据链路层 |
网络层 |
传输层 |
会话层 |
表示层 |
应用层 |
TCP/IP 模型 |
---|
网络接口层 |
互联网层 |
传输层 |
应用层 |
- 1995: SSL
- 1999: TLS 1.0
- 2006: TLS 1.1
- 2008: TLS 1.2
- 2018: TLS 1.3
对称加密和非对称加密
对称加密(Symmetric Encryption)
定义:对称加密使用同一个密钥(称为共享密钥或秘密密钥)来加密和解密数据。发送方和接收方都必须知道这个密钥,并且密钥必须保密。
特点:
- 速度快:对称加密算法通常比非对称加密算法更快,适合加密大量数据。
- 密钥管理:由于使用同一个密钥,密钥的分发和管理是一个挑战。
- 安全性:如果密钥泄露,数据将不再安全。
常见算法:
- DES(Data Encryption Standard)
- 3DES(Triple DES)
- AES(Advanced Encryption Standard)
非对称加密(Asymmetric Encryption)
定义:非对称加密使用一对密钥,一个公钥和一个私钥。公钥可以公开,用于加密数据;私钥必须保密,用于解密数据。
特点:
- 安全性高:即使公钥被泄露,没有私钥也无法解密数据。
- 密钥管理简单:公钥可以公开分发,私钥只需保密。
- 速度较慢:非对称加密算法通常比对称加密算法慢,适合加密少量数据。
常见算法:
- RSA(Rivest-Shamir-Adleman)
- ECC(Elliptic Curve Cryptography)
- DSA(Digital Signature Algorithm)
应用场景
- 对称加密:适用于需要快速加密大量数据的场景,如文件加密、数据库加密等。
- 非对称加密:适用于需要高安全性的场景,如数字签名、SSL/TLS 加密通信等。
结合使用
在实际应用中,对称加密和非对称加密常常结合使用,以发挥各自的优势。例如,在 SSL/TLS 协议中,会话密钥(对称密钥)用于加密数据,而非对称加密用于安全地交换会话密钥。
SSL 证书的公信力如何保证
1. 证书颁发机构(CA)
SSL 证书由受信任的第三方机构颁发,这些机构被称为证书颁发机构(Certificate Authorities,简称 CA)。CA 负责验证申请者的身份,并确保证书中的信息准确无误。
2. 数字签名
每个 SSL 证书都包含一个由 CA 使用其私钥生成的数字签名。这个签名可以被任何人使用 CA 的公钥进行验证,确保证书内容未被篡改。
3. 根证书和信任链
大多数操作系统和浏览器都预装了多个受信任的 CA 的根证书。当用户访问一个使用 SSL 证书的网站时,浏览器会检查证书的信任链,确保它最终链接到一个受信任的根证书。
4. 证书透明度(CT)
证书透明度是一个开放的框架,要求 CA 将所有颁发的证书记录在公开的日志中。这允许任何人监控和审计证书的颁发,防止滥用和错误颁发。
5. 定期验证和更新
CA 会定期验证证书持有者的身份,并要求定期更新证书。这确保了证书信息的时效性和准确性。
6. 行业标准和监管
CA 必须遵守行业标准和监管要求,如 WebTrust 和 ETSI。这些标准确保 CA 遵循最佳实践,并保持高水平的操作和安全标准。
通过这些机制,SSL 证书的公信力得以保证,确保用户可以安全地进行在线交易和通信。
SSL协议握手时Nginx 的性能瓶颈在哪里?
1. CPU 性能
SSL/TLS 握手过程涉及大量的加密和解密操作,这些操作对 CPU 的计算能力要求较高。特别是在使用高强度的加密算法(如 AES-256)或非对称加密算法(如 RSA 2048 位或更高)时,CPU 的负载会显著增加。
2. 内存使用
SSL/TLS 握手过程中需要生成和存储临时密钥、会话标识符和缓存信息。这些操作会占用一定的内存资源。如果服务器内存不足,可能会影响握手过程的性能。
3. 网络延迟
SSL/TLS 握手是一个多次往返的过程,涉及多个网络请求和响应。网络延迟较高时,握手过程的时间会延长,从而影响整体性能。
4. SSL 会话缓存
Nginx 支持 SSL 会话缓存,以减少重复握手的开销。如果会话缓存配置不当或缓存空间不足,可能会导致频繁的完整握手,从而影响性能。
5. SSL 协议版本和加密套件
使用较旧的 SSL/TLS 协议版本(如 SSLv3 或 TLS 1.0)或弱加密套件可能会增加握手过程中的计算开销,并降低安全性。建议使用最新的 TLS 版本(如 TLS 1.3)和强加密套件。
6. 并发连接数
在高并发环境下,大量的 SSL/TLS 握手请求可能会导致 CPU 和内存资源紧张。合理配置 Nginx 的 worker 进程数和连接数上限,以及使用负载均衡和反向代理等技术,可以缓解这一问题。
优化建议
- 升级硬件:使用更强大的 CPU 和更多的内存。
- 使用硬件加速:如使用支持 SSL/TLS 加速的硬件设备(如 SSL 加速卡)。
- 优化 Nginx 配置:合理配置 SSL 会话缓存、加密套件和协议版本。
- 使用负载均衡:通过负载均衡分散 SSL/TLS 握手请求,减轻单个服务器的压力。
- 启用 HTTP/2:HTTP/2 支持多路复用,可以减少握手次数,提高性能。
通过这些优化措施,可以有效提升 Nginx 在 SSL/TLS 握手过程中的性能。
免费SSL证书实现一个HTTPS 站点
1. 安装 Certbot
Certbot 是一个用于获取和更新 Let's Encrypt 证书的工具。你可以通过以下命令安装 Certbot:
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
2. 获取 SSL 证书
使用 Certbot 为你的域名获取 SSL 证书。假设你的域名是 example.com,你可以运行以下命令:
```bash
Copy code
sudo certbot --nginx -d example.com -d www.example.com
这个命令会自动配置 Nginx,并获取并安装证书。
- 验证自动更新
Let's Encrypt 证书的有效期为 90 天,Certbot 提供了自动更新功能。你可以通过以下命令测试自动更新是否正常工作:
Copy code
sudo certbot renew --dry-run
- 配置 Nginx
Certbot 会自动修改你的 Nginx 配置文件,添加 SSL 相关的配置。你可以检查 /etc/nginx/sites-available/default 或你的自定义配置文件,确保以下内容存在:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
location / {
# 你的其他配置
}
}
- 重启 Nginx
完成配置后,重启 Nginx 以应用更改:
Copy code
sudo systemctl restart nginx
- 设置 ssl_session_timeout
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1440m;
OpenResty 用lua 实现简单服务
安装 OpenResty
首先,你需要安装 OpenResty。你可以从 OpenResty 官方网站 获取安装指南。
配置 Nginx
创建一个新的 Nginx 配置文件,例如 nginx.conf
,并添加以下内容:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("<h1>Hello, OpenResty!</h1>")
}
}
}
}
启动 OpenResty
保存配置文件后,启动 OpenResty:
Copy code
sudo openresty -c /path/to/your/nginx.conf
访问服务
打开浏览器,访问 http://localhost,你应该会看到一个简单的 HTML 页面,显示 "Hello, OpenResty!"。
解释
worker_processes:设置工作进程的数量。
worker_connections:设置每个工作进程的最大连接数。
http:HTTP 服务的配置块。
server:定义一个虚拟主机。
location /:匹配根路径的请求。
content_by_lua_block:使用 Lua 脚本生成响应内容。
通过这些步骤,你可以使用 OpenResty 和 Lua 快速实现一个简单的 HTTP 服务。
标签:TLS,加密,证书,review,Nginx,nginx,SSL From: https://www.cnblogs.com/zhaomo/p/18325704