nginx 笔记

目录
    本文上次更新于 784 天前,其内容可能已经过时,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

    命令行参数

    • -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 评论
    内联反馈
    查看所有评论