nginx 笔记
命令行参数
- -c /path/ : 指定配置文件
- -t : 不运行,仅测试配置文件
- -v/V : 显示 nginx 的版本
master 和 worker
- nginx 启动后会启动 master 和 worker 进程
- master :主进程,读取 conf 文件
- worker : 子进程,响应并解析文件
配置文件
# 文件名 : nginx.conf
# 注释,以 # 开头,每一句以 ; 结尾
user nobody; # 以 nobody 用户启动
worker_processes 1; # 启动 nginx 时有多少个 worker 进程,一般对应物理 cpu 数。
event {
worker_connections 1024; # 每一个 worker 进程可以创建多少个连接
}
http {
# 引入配置文件,mine.types 表明服务器端返回发送的文件类型,会包含在头部。
# 如没有include,当访问图片时,会直接下载,而当 include 后,会直接在浏览器中展示
include mine.types;
# 当该类型不存在在 mine.types 中时,默认以流方式下载
default_type application/octet-stream;
# 使用 linux 的 sendfile(socket, file, len)高效网络传输,数据 0 传输,减少数据拷贝过程
sendfile on;
# 保持长连接的时间
keepalive_timeout 65;
# 禁止 ip 访问网站,只允许域名访问 [start,2023-4-24]
server {
listen 80 default_server;
server_name _;
return 403;
}
server {
listen 443 ssl default_server;
server_name _;
return 403;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache builtin:1000 shared:SSL:10m;
}
# 禁止 ip 访问网站,只允许域名访问 [end,2023-4-24]
}
# httpds 为 proxy_pass 后的名称,多个 server 实现负载均衡
# proxy_pass http://httpds;
# weight : 设置权重,
# down : 不参与负载均衡,如 192.168.6.5
# backup : 备用,只有所有都不工作了才会启动 192.168.6.6
upstream httpds{
server 192.168.6.2:8081 weight=8;
server 192.168.6.3:8081 weight=2;
server 192.168.6.4:8081 weight=1;
server 192.168.6.5:8081 weight=1 down;
server 192.168.6.6:8081 weight=1 backup;
}
# 主机,一个 server 代表一个主机,nginx 可以有多个主机,根据端口号的不同可以配置多个主机,
# 虚拟主机,vhost
server {
# 端口号加 server_name 必须要唯一,当端口号一样时,server_name 必须不同
listen 80;
# 域名或者主机名(能够解析的主机名,不能解析的用ip),可以配置多个主机名,支持通配符
# 匹配顺序 : 完整匹配,通配符匹配,通配符结束匹配和正则匹配
server_name localhost localhost2;
# location 用来匹配 uri,域名后面的路径,
# / 等于 http://localhost/
location / {
# 设置认证. [start, 2023-5-8]
# htpasswd /etc/nginx/conf.d/passwd user1 用于生成密码
auth_basic "Hello World";
auth_basic_user_file /etc/nginx/conf.d/passwd;
# 设置认证. [end, 2023-5-8]
# 有了 proxy_pass 之后,root 就不在起作用,反向代理关键词
# proxy_pass 后可以接主机或者网址,网址要写全,如果不写全,可能出现 302 跳转
# https 时需要配置 ssl 证书
# proxy_pass http://192.168.6.2
root html; # 相对路径,相对于域名的主目录
index index.html index.htm; # 默认页
}
error_page 500 502 503 504 /error.html # 服务器端出现错误时,转到error.html
location /error.html {
root html;
}
}
location
动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。location有两种表示形式,一种是使用前缀字符,一种是使用正则。如果是正则的话,前面有~或~*修饰符。对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的.,..等。这一步是匹配的前置工作。
# 配置 css 目录,实现动静分离
location /css {
root html;
# 将 2.html 转化到 index.jsp?num=2
# break : 匹配到第一个就返回
rewrite ^/2.html /index.jsp?num=2 break;
# $1 : 第一个匹配的规则
rewrite ^/([0-9]+).html$ /index.jsp?num=$1 break;
index index.html index.htm;
}
匹配修饰符
- = : 精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。
- ^~ : 如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找,该规则不是正则匹配
- ~ : 正则匹配,区分大小写。
- ~* : 正则匹配,不区分大小写。
- / 通用匹配, 如果没有其它匹配,任何请求都会匹配到 例子:
- 匹配 / 的优先级小于 /js,路径越准确,优先级越高
- ~/(js | img | css) : ~ 开始匹配, 不区分大小写,区分 js、img 或者 css 中的一个
匹配成功后先找 file1, 如果找到就执行 file1, 没找到就执行 file2,依次类推,如果前面都没找到,则执行 uri
匹配过程
具体的匹配过程如下:
- 如果找到了精确匹配的location,也就是使用了 = 修饰符的location,结束查找,使用它的配置。 如输入 /a,location 中 /a 和 = a,则 =a 匹配上,结束匹配。
- 首先先检查使用前缀字符定义的location,也就是使用了 ^~ 修饰符的location,选择最长匹配的项并记录下来。 如输入的为 /a/b/c/,location 中有 ^~/a,^~/a/b 和 ^~/a/b/c; 则^~/a/b/c 匹配上,结束匹配。
- 然后按顺序查找使用正则定义的location,也就是使用了 ~ 或 ~* 修饰符的location,如果匹配则停止查找,使用它定义的配置。
也就是说先找 =
, 然后找 ^~
中路径最长的, 在再找 ~
或者 ~*
,最后找 /
rewrite
好处 : 可以缩短 url,隐藏一些参数,安全
用法
‘rewrite regex replacement [flag]’ : 功能:以正则 regex 的方式重写 replacement 的内容
- regex : 正则表达式,以 "^" 开始,以 "$" 结束。
- replacment : 需要替换的地址,真实地址
例子:
rewrite ^/2.html$ /index.php?pagenumber=2
访问 xx/2.html 时将相当于访问 xx/index.php?pagenumber=2,但是本机不一定有 2.htmlrewrite ^/([0-9]).html$ /index.php?pagenumber=$1
访问 xx/y.html 时访问真实的 xx/index.php?pagenumber=y,$1 代表前面的第一个正则表达式
正则
- ~ 区分大小写,~* 不区分大小写
- $args,获取当前请求的参数串(即请求中问号后面的部分,如果有的话)
系统函数
$remote_addr : 用以记录客户端的ip地址
deny x.x.x.x : 拒绝 ip x.x.x.x 访问,可以用在 location 块中,允许某个 ip 不能访问该类型页面。
allow x.x.x. : 允许 ip x.x.x.x 访问
proxy_pass http://x.x.x.x : 将匹配到的页面重定向到 http://x.x.x.x 。
error_page 404 http://x.x.x.x : 错误页 http://x.x.x.x 。
proxy_method get : 只允许代理 get 方法,还可以设置 post 方法。
HTTP X-Forwarded-For
说明
一个 HTTP 扩展头
用法
X-Forwarded-For: client, proxy1, proxy2