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

匹配过程

具体的匹配过程如下:

  1. 如果找到了精确匹配的location,也就是使用了 = 修饰符的location,结束查找,使用它的配置。 如输入 /a,location 中 /a 和 = a,则 =a 匹配上,结束匹配。
  2. 首先先检查使用前缀字符定义的location,也就是使用了 ^~ 修饰符的location,选择最长匹配的项并记录下来。 如输入的为 /a/b/c/,location 中有 ^~/a,^~/a/b 和 ^~/a/b/c; 则^~/a/b/c 匹配上,结束匹配。
  3. 然后按顺序查找使用正则定义的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.html
  • rewrite ^/([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

guest
0 评论
内联反馈
查看所有评论