郁郁青青 长过千寻

Nginx 要点记录


    1. ほしのかけら
    2. Reference

Игорем Сысоевым

yum 安装

1
2
3
4
5
6
7
8
9
10
11
12
yum install epel-release -y
yum list all | grep nginx
yum install nginx -y
rpm -ql nginx
rpm -ql nginx | grep bin
# 查看启动参数
netstat -tnlp | grep :80
# 查看默认 80 端口是否被占用
curl ifconfig.me
# 查看本机公网地址
/usr/sbin/nginx -c /etc/nginx/nginx.conf
# 启动 nginx

编译安装,编译目录 /opt/nginx,nginx 源码目录 /opt/source/nginx-1.19.0

配置参数:prefix, pid-path, conf-path, with-pcre, with-zlib 等。

模块不内置使用 –with 添加,内置了使用 –without 移除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar xf nginx-1.19.0.tar.gz
tar xf pcre-8.44.tar.gz
tar xf zlib-1.2.11.tar.gz
# 解压
cd nginx-1.19.0
./configure --help
# 查看编译安装的配置参数
rpm -ql pcre
rpm -ql zlib
# 查看安装目录
./configure --prefix=/opt/nginx --conf-path=/opt/nginx/conf/nginx.conf --user=nginx --group=nginx --pid-path=/opt/nginx/pid/nginx.pid --error-log-path=/opt/nginx/logs/error.log --with-pcre=/opt/source/pcre-8.44 --with-zlib=/opt/source/zlib-1.2.11 --with-http_image_filter_module --with-http_stub_status_module --http-log-path=/opt/nginx/logs/access.log
yum install gd gd-devel -y
make
# configure: error: Invalid C++ compiler or C++ compiler flags // 出现错误
yum install gcc-c++
vim MakeFile
make install

查看编译的 nginx 有哪些命令:/opt/nginx/sbin/nginx -h

常用命令:/opt/nginx/sbin/nginx -t,检查配置文件语法是否正确;/opt/nginx/sbin/nginx -s signal,向进程发射信号量。


Nginx 程序的 4 个组成部分(yum 包安装,非编译安装):二进制执行程序 /usr/sbin/nginx配置文件 /etc/nginx/nginx.conf/var/log/nginx/access.log/var/log/nginx/error.log

文件结构:{main, events, {http, {server, {location, [location]}}, [server]}}

子进程使用共享内存通信,反向代理时,CacheManager 管理缓存,CacheLoader 加载缓存

1
2
3
4
5
6
kill -l
# 查看所有信号量
### SIGCHLD kill -17 $PID ### SIGQUIT kill -3 $PID
### SIGTERM kill -15 $PID ### SIGKILL kill -9 $PID
### SIGHUP kill -1 $PID ### SIGUSR1 kill -10 $PID
### SIGUSR2 kill -12 $PID ### SIGWINCH kill -28 $PID

Master 进程的任务:监控 worker 进程CHLD;管理 worker 进程;接收信号TERM, INT, QUIT, HUP, USR1, USR2, WINCH

Worker 进程的任务:接收信号TERM, INT, QUIT, USR1, WINCH

sbin 目录下的程序加参数运行:reload: HUP; reopen: USR1; stop: TERM; quit: QUIT

1
2
3
4
lscpu
# 查看 cpu 数量,nginx 启动对应数量的 work 子进程
/usr/sbin/nginx -h
# 查看参数运行 nginx 二进制程序

reload 重载配置文件流程:向 master 进程发送 HUP 信号 => master 检测语法正确 => master 打开监听端口(新配置可能配置新端口)=> master 启动新 worker 子进程 => master 向旧 worker 发送 QUIT 信号 => 旧 worker 关闭监听句柄,处理完关闭进程

热(平滑)升级流程:

1
2
3
4
5
6
7
=> 旧 nginx 文件替换成新 nginx 文件
=> 向 master 进程发送 USR2 信号 // kill -s SIGUSR2 {old-pid}
=> master 修改 pid 文件,加后缀 .oldbin
=> master 用新 nginx 文件启动新 master
=> 向旧 master 发送 WINCH 信号,旧 worker 子进程退出 // kill -s SIGWINCH {old-pid} // kill -s SIGQUIT {old-pid}
=> 回滚情形:向旧 master 发送 HUP,向新 master 发送 QUIT // kill -s SIGHUP {old-pid} // kill -s SIGQUIT {new-pid}
=> 。

Linux 自身最大打开文件数:65535

1
2
mkdir /opt/nginx/tmp
chown -R nginx.nginx /opt/nginx/tmp

server_name 优先级:精准,左侧通配符,右侧通配符,正则

root 和 alias 的区别:root 导致在映射路径尾部叠加上层路径,alias 重命名即尾部不叠加;alias 末尾一定加“/”,alias 只能位于 location 块中。

location 指令中匹配规则优先级:高 = -> ^~ -> ~ -> ~* -> 低

location 指令:

规则 含义 例子
= 精确匹配 location = /images/ {…}
~ 正则 location ~ \.(jpg|gif)$ {…}
~* 正则,不区分大小写 location ~* \.(jpg|gif)$ {…}
^~ 匹配到即停止搜索 location ^~ /images/ {…}
不带符号 location / {…}

location URL 带不带反斜杠 \ 的区别:不带杠将导致—检查文件夹,若无再检查文件,反之只检查目录。

if 的 condition:

condition description
$variable 仅为变量时,值为空或以 0 为开头的字符串都是 false
= 或 != 相等或不等比较
~ 或 !~ 正则匹配或非正则匹配
~* 正则匹配不区分大小写
-f 或 !-f 检查文件存在或不存在
-d 或 !-d 检查目录存在或不存在
-e 或 !-e 检查文件、目录、符号链接等存在或不存在
-x 或 !-x 检查文件可不可执行。

limit_conn 模块的基本功能:限制客户端并发连接数;使用共享内存,对所有 worker 子进程生效;默认编译,用 –without-http_limit_conn_module 禁用

limit_req 模块的基本功能:限制处理请求的平均数据;默认编译;共享内存;限流算法 leaky_bucket 算法

1
2
access 模块限定 ip、网段;auth_basic 限定特定用户,without 禁用默认;auth_request 鉴权服务器收到 http 状态码做访问控制;rewrite 模块的 return 指令;rewrite 模块的 rewrite 指令,flag 有 last 和 break 和 permanent 和 redirect;
if

auth_basic 模块:基于 HTTP Basic Authentication 协议进行用户名密码认证;auth_basic_user_file 命令设置密码文件地址,auth_basic 命令设置浏览器给用户的提示文字。

反向代理优势:隐藏真实服务器;便于横向扩充,提升吞吐量;动静分离,更健壮。

upstream 模块的部分解释:server 字段 parameters 参数的 fail_timeout 和 max_fails 的值表示,Nginx 发现应用服务器不可用时开始计时,在该时间里尝试请求次数达到最多次数,剩余的时间里不再请求server文档;keepalive 字段的 connections 参数值是空闲长连接的最大数量;keepalive_requests 限制单个长连接最多请求次数;keepalive_timeout 超过时间自动销毁。

proxy_pass 带不带反斜杠 \ 的区别:不带,上网的人请求什么地址 nginx 向上游透传什么地址,带则把和 location 重叠的部分删去后再请求上游。

代理场景下 nginx 接收用户请求包体的相关参数:client_max_body_size, client_body_buffer_size, client_body_in_file_only, client_body_in_single_buffer, proxy_request_buffering, client_body_timeout.

client_max_body_size:设置上传报文体的大小,如果大于设置值将报“request entity too large”错误。

负载均衡器的抛出问题:session 共享;选择应用服务器的算法;应用服务器的缓存信息在 nginx 上的保存。

ほしのかけら

美化后缀 html 和斜杠:https://cobwwweb.com/remove-html-extension-and-trailing-slash-in-nginx-config;https://sixtwothree.org/posts/nginx-configuration-removing-html-file-extensions-and-trailing-slashes。

二级域名转发:

vim 命令

1
2
3
4
5
6
9yy
# 复制 9 行
:.,$-1d
# 删除从当前行至(最后一行-1)行
:set nu
# 显示行数

shell 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mkdir {all-match,left-match,right-match}
# 创建 3 个文件夹
tail -f /opt/nginx/logs/error.log
# 查看错误日志
curl localhost/test
# 访问,-I 返回响应头
cat /etc/hosts
# 域名映射
mkdir /opt/nginx/html/app/proxy
# 创建目录,创建了没有的 app 和 proxy
less configure
# 查看
ls -rlt
# 长格式按时间倒序,新的在下
ss -tnl
# 查看主机监听的端口
mkdir server{2..3}
# 创建 server2 和 server3 目录
echo "<h1>test1 nginx</h1>" >> domain_vm1/login.html
# 保存内容到指定目录
ls domain_vm*
# 查看这个前缀的文件夹里的文件
mv doamin_vm1/ domain_vm1
# 重命名

Reference

Common Nginx misconfigurations that leave your web server open to attack:阮一峰 2021/03,常见的 Nginx 不安全配置;搜索了一下,很快被网友翻译成了中文,常见的 Nginx 配置错误,使您的 Web 服务器可以被攻击

页阅读量:  ・  站访问量:  ・  站访客数: