文章目录
- 引言
- 思路
- 环境
- 配置前准备
- 配置详解
- 总结
- 参考
引言
最近在准备春招中,这几天把学过的nginx常用模块复习了一遍,并作整理记录,便于以后回看。
思路
先在nginx中配置下列功能:
- 搭建静态资源服务器
- 具有缓存功能的反向代理服务器
- 使用goaccess分析access日志
- 用自签证书搭建https站点
再依次添加其他模块:limit_conn、limit_req、access、auth_basic、auth_request、log、gzip、stub_status等实现更丰富的功能
环境
在Ubuntu20.10(当前最新版)上,apt安装了一个nginx,版本为1.18.0。为方便连接,在Ubuntu20.10上设置固定ip。
Host | IP | Nginx version |
---|---|---|
Ubuntu20.10 | 192.168.211.131 | 1.18.0 |
配置前准备
- 安装goaccess,后台执行goaccess命令
sudo apt install goaccess -y
sudo goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html --time-format='%H%M%S' --date-format='%d%m%Y' --log-format=COMBINED &
# 生成websocket服务器监听客户连接
- 生成自签SSL证书
- 创建证书请求csr,同时生成rsa私钥
sudo openssl req -new -out ssl.csr
- 上一步生成 .pem 私钥时必须输密码,可执行去除密码命令
sudo openssl rsa -in privkey.pem -out privkey.pem
- 由私钥、证书请求生成证书
sudo openssl x509 -req -days 365 -signkey privkey.pem -in ssl.csr -out ssl.crt
- 查看rsa密钥、csr证书请求、crt证书
sudo openssl rsa -text -in privkey.pem -noout
sudo openssl req -text -in ssl.csr -noout
sudo openssl x509 -text -in ssl.crt -noout
配置详解
主配置文件nginx.conf,加载 conf.d/ 目录下的 .conf 配置文件
#user www-data;
user root; # 修改nginx执行用户为root
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
include /etc/nginx/conf.d/*.conf; # 加载自定义配置
# include /etc/nginx/sites-enabled/*;
}
静态资源服务器配置文件 static_web.conf,这里添加了limit_conn、limit_req、autoindex、rewrite等模块
# 80端口的虚拟主机
# 限制连接
limit_conn_zone $binary_remote_addr zone=connip:10m; # 限制每个客户端ip的并发连接数
limit_conn_zone $server_name zone=connserver:10m; # 对虚拟主机的连接限制(不生效,难道是对域名才生效?)
limit_req_zone $binary_remote_addr zone=reqip:10m rate=2r/m; # 限制每个ip的请求速率
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
rewrite ^/(.*)$ https://192.168.211.131:443/$1 permanent;
# http的访问重写为https
server_name _;
# 配置静态资源服务器
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
limit_conn connip 3; # 每个ip并发连接数最多为3
limit_conn_status 503; # 超过就返回503
}
location /blog {
autoindex on; # 文件共享
}
location ~ \.jpg$ { # 区分大小写的正则匹配,匹配.jpg的uri; 不能写成*\.jpg??
index TS.jpg; # index显示文件
}
location ~* \.mp4$ { # 不分大小写的正则匹配
index BlankSpace.mp4;
}
}
具有缓存功能的反向代理服务器 proxy_cache.conf,同时添加 goaccess 分析访问日志功能。
# 具有缓存功能的反向代理服务器
upstream webserver {
server 192.168.211.131 max_fails=3 fail_timeout=30s;
# max_fails 允许失败次数,默认为1
# fail_timeout 当max_fails次失败后,暂停把请求交给该后端服务器的时间
}
# 这个buffer还没搞懂,看看能不能解决206的问题
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
# 指定缓存路径,缓存区域名称,内存缓存空间大小10m,磁盘缓存空间10g,60分钟没被访问自动清除,这里不额外指定temp路径
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
#map $request_method $purge_method {
# PURGE 1;
# default 0;
#}
server {
listen 100;
location / {
# 传递真实地址(客户端IP)(没法传递?)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://webserver;
# 把100端口请求交给80端口
# 缓存功能
proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 1d;
proxy_cache_valid 301 302 5m;
proxy_cache_valid any 1m;
expires 1d; # 浏览器缓存1天
#proxy_cache_purge $purge_method;
}
location ~ /purge(/.*) {
# 只允许指定ip段才可清除uri缓存
allow 127.0.0.1;
allow 192.168.211.0/24;
deny all;
proxy_cache_purge my_cache $host$uri$is_args$args;
}
# 以.php、.cgi、.jsp结尾的动态资源不缓存
location ~ \.(php|cgi|jsp)$ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://webserver;
}
# goaccess分析access日志
location /report.html {
alias /var/www/html/report.html;
}
}
https站点配置 https.conf
# 自签证书搭建https站点
server {
listen 443 ssl;
root /var/www/html;
index index.nginx-debian.html;
ssl_certificate /etc/nginx/key/ssl.crt;
ssl_certificate_key /etc/nginx/key/privkey.pem;
limit_conn connip 5; # 该https站点最大并发连接数为5
limit_conn_status 500; # 超过就返回500
limit_conn_log_level warn; # 限制发生时的日志级别
limit_rate 50; # 限制响应速率,方便测试 limit_conn模块
# 单位为每秒字节数
limit_req zone=reqip; # 限制每个ip请求速率
# limit_req_status可以不定义,默认503
# 经测试,limit_req 优先级高于 limit_conn
location / {
try_files $uri $uri/ =404;
}
location /blog {
autoindex on; # 自动索引,列出文件列表
# access模块作访问控制,auth_basic模块作认证处理
satisfy all; # 值为all,满足所有access阶段的模块才通过;
# 值为any,满足任意一个access阶段模块就行
allow 192.168.211.0/24;
deny all;
auth_basic "closed site"; # 认证字符串
auth_basic_user_file /etc/nginx/conf.d/passwd; # 认证用户文件
# 如果认证失败,accesslog中响应状态码是401(Unauthorized)
}
# auth_request模块根据子请求响应状态码作认证
location /willow.webm {
auth_request /auth;
}
location = /auth {
proxy_pass https://192.168.211.131:443/auth_test;
}
location /auth_test {
return 503;
# 子请求返回200状态码,允许访问;返回401或403,拒绝访问并返回状态码
# 如果是其他状态码,视作错误,返回500错误状态码
}
location /status { # 使用 stub_status模块
stub_status on; # 查看nginx基本状态信息
access_log off;
allow 192.168.211.0/24; # 作访问控制
deny all;
}
}
gzip模块
# gzip模块的配置
gzip on;
gzip_buffers 16 8k; # 压缩响应的缓冲区数量大小
gzip_min_length 100; # 小于100字节的不压缩
gzip_comp_level 3; # 压缩级别3
gzip_types text/plain; # 压缩类型(mime-type)
gzip_http_version 1.1; # 压缩响应的请求http版本
gzip_vary on; # 压缩响应的头部添加Vary字段
log模块
# access_log和error_log的配置
# 把默认的combined格式改为compression(多了$gzip_ratio字段)
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
# 指定访问日志路径、格式、缓存大小、压缩级别;达到flush的过期时间,就把日志从内存写到磁盘
access_log /etc/nginx/logs/access.log compression; # buffer=32k gzip flush=20s;
# 注意:这里如果使用了buffer或gzip参数,写入日志的内容会被缓存;这时access.log就暂时看不到新的访问记录
# open_log_file_cache max=100 inactive=20s valid=1m min_uses=1;
# 对名字包含变量名的日志文件做优化
error_log /etc/nginx/logs/error.log; # error.log路径
总结
nginx提供的模块相当多,可以实现不少好玩的功能。需要配置某个模块时,可查看官方文档 http://nginx.org/en/docs/ 。官网的文档给出了每个模块的配置例子,指令的语法、默认值和上下文,以及每个参数的功能和用法等,相当全面。
梳理出整个配置过程中用到的所有模块:
模块名称 | 功能 |
---|---|
http_core_module | 核心功能模块 |
http_proxy_module | 反向代理模块 |
http_upstream_module | 负载均衡模块 |
http_ssl_module | ssl模块,配置https站点 |
http_rewrite_module | url重写模块,可以把http访问重定向到https |
http_gzip_module | 压缩模块,压缩nginx的响应 |
http_access_module | 访问控制模块 |
http_auth_basic_module | 基本认证模块,访问时要输入用户名和密码 |
http_auth_request_module | 请求认证模块,对特定uri的请求作访问控制 |
http_autoindex_module | 自动索引模块,返回目录下的文件列表 |
http_limit_conn_module | 连接限制模块,限制客户端并发连接数 |
http_limit_req_module | 请求限制模块,限制客户端请求速率 |
http_log_module | 日志模块,配置 access_log |
http_stub_status_module | 状态检测模块,查看nginx基本状态信息 |
正月初二,写下了2021年的第一篇博客。新年快乐!
参考
Nginx官方文档
Nginx部署web缓存服务环境 - 操作记录
Nginx的proxy_cache缓存效能
SSL Certificate Verification
使用nginx访问服务器log日志
Debian Apt-get方式添加Nginx模块