Nginx笔记

Nginx笔记

Posted by AnAn on November 10, 2021

介绍

以下学习笔记来自于尚硅谷的Nginx课程

目录

前言

  • 说明 Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理负载平衡器HTTP缓存。 该软件由伊戈尔·赛索耶夫(Игорь Сысоев)创建并于2004年首次公开发布。2011年成立同名公司以提供支持。 2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。

  • 原理 多进程:一个 Master 进程、多个 Worker 进程 Master 进程:管理 Worker 进程 对外接口:接收外部的操作(信号) 对内转发:根据外部的操作的不同,通过信号管理 Worker 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程 Worker 进程:所有 Worker 进程都是平等的 实际处理:网络请求,由 Worker 进程处理; Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。

  • 常用命令
    • nginx -v #查看版本号
    • nginx #启动
    • nginx -s stop #关闭
    • nginx -s reload #重新加载
  • 默认配置文件
    • nginx.conf

      • user nginx;
      • worker_processes auto;#工作进程数
      • error_log /var/log/nginx/error.log notice;
      • pid /var/run/nginx.pid;
      • events {
      • worker_connections 1024;#最大连接数
      • }
      • http {
      • include /etc/nginx/mime.types;
      • default_type application/octet-stream;
      • log_format main '$remote_addr - $remote_user [$time_local] "$request" '
      • '$status $body_bytes_sent "$http_referer" '
      • '"$http_user_agent" "$http_x_forwarded_for"';
      • access_log /var/log/nginx/access.log main;
      • sendfile on;
      • #tcp_nopush on;
      • keepalive_timeout 65;
      • #gzip on;
      • include /etc/nginx/conf.d/*.conf;
      • }
    • conf.d/default.conf

      • server {
      • listen 80;
      • listen [::]:80;
      • server_name localhost;
      • #access_log /var/log/nginx/host.access.log main;
      • location / {
      • root /usr/share/nginx/html;
      • index index.html index.htm;
      • }
      • #error_page 404 /404.html;
      • # redirect server error pages to the static page /50x.html
      • #
      • error_page 500 502 503 504 /50x.html;
      • location = /50x.html {
      • root /usr/share/nginx/html;
      • }
      • # proxy the PHP scripts to Apache listening on 127.0.0.1:80
      • #
      • #location ~ \.php$ {
      • # proxy_pass http://127.0.0.1;
      • #}
      • # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
      • #
      • #location ~ \.php$ {
      • # root html;
      • # fastcgi_pass 127.0.0.1:9000;
      • # fastcgi_index index.php;
      • # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
      • # include fastcgi_params;
      • #}
      • # deny access to .htaccess files, if Apache's document root
      • # concurs with nginx's one
      • #
      • #location ~ /\.ht {
      • # deny all;
      • #}
      • }

      location值令

      精确匹配: = , 后面的表达式中写的是纯字符串 字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串 正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式 匹配顺序: = > ^~ > ~ > ~* > /

      1. =
        • # 精确匹配,必须是 servername/
        • location = / {
        • ...
        • }
        • # 精确匹配,必须是127.0.0.1/login
        • location = /login {
        • ...
        • }
        • 2. ^~ ```properties ## 对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写 ## servername/static/js. location ^~ /static/ { ... } ```
        1. ~
          • ##对 uri (可以不是起始字符)做 正则匹配,区分大小写
          • ## 区分大小写,以gif,jpg,js结尾
          • location ~ \.(gif|jpg|png|js|css)$ {
          • ...
          • }
        2. ~*
          • ##对 uri (可以不是起始字符)做 正则匹配,不区分大小写
          • ## 不区分大小写,匹配.png结尾的
          • location ~* \.png$ {
          • ...
          • }
        3. !~ 和!~*
          • ##分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配,可以用于错误页
          • ## 区分大小写,匹配不以.xhtml结尾的
          • location !~ \.xhtml$ {
          • ...
          • }
          • location !~* \.xhtml$ {
          • ...
          • }
        4. /
          • ## 什么都可以
          • location / {
          • ...
          • }
        5. @
          • ##此种方式的location配置,无法通过外网访问,只能通过内网跳转,实现容错的功能
          • location @name { ... }

Rewrite重定向&&Return重定向

  • last 表示完成rewrite
  • break 中止Rewirte,不在继续匹配
  • redirect 返回临时重定向的HTTP状态302
  • permanent 返回永久重定向的HTTP状态301
  • 1、下面是可以用来判断的表达式:
  • -f和!-f用来判断是否存在文件
  • -d和!-d用来判断是否存在目录
  • -e和!-e用来判断是否存在文件或目录
  • -x和!-x用来判断文件是否可执行
  • 2、下面是可以用作判断的全局变量
  • 例:http://localhost:88/test1/test2/test.php
  • $host:localhost
  • $server_port:88
  • $request_uri:/test1/test2/test.php
  • $document_uri:/test1/test2/test.php
  • $document_root:D:\nginx/html
  • $request_filename:D:\nginx/html/test1/test2/test.php
  • Rewrite
    • server {
    • listen 80;
    • server_name start.igrow.cn;
    • root html;
    • index index.html index.php;
    • rewrite ^(.*) https://star.igrow.cn$1 permanent;
    • }
  • Return
  • server {
  • listen 80;
  • server_name start.igrow.cn;
  • return 301 https://$host$request_uri;
  • }
  • 区别

    rewrite 重定向:需要先做正则匹配,然后再给客户端返回新地址进行重定向(做了两步操作) return 重定向:不需要做正则匹配,直接给客户端返回新地址进行重定向(做了一步操作)

if

  • // 如果用户设备为IE浏览器的时候,重定向 。如果UA包含"MSIE",rewrite请求到/msid/目录下
  • if ($http_user_agent ~ MSIE) {
  • rewrite ^(.*)$ /msie/$1 break;
  • }
  • //如果cookie匹配正则,设置变量$id等于正则引用部分
  • if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
  • set $id $1;
  • }
  • //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
  • if ($request_method = POST) {
  • return 405;
  • }
  • //限速,$slow可以通过 set 指令设置
  • if ($slow) {
  • limit_rate 10k;
  • }
  • //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
  • if (!-f $request_filename){
  • break;
  • proxy_pass http://127.0.0.1;
  • }
  • //如果query string中包含"post=140",永久重定向到example.com
  • if ($args ~ post=140){
  • rewrite ^ http://example.com/ permanent;
  • }
  • //防盗链
  • //如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为true
  • //语法: valid_referers none | blocked | server_names | string ...;
  • //参数说明:
  • //none: 不允许 “Referer” 来源头部为空的情况
  • //blocked: 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除
  • //server_names: “Referer”来源头部包必须含当前的server_names (当前域名)可以多个
  • location ~* \.(gif|jpg|png|swf|flv)$ {
  • valid_referers none blocked www.jefflei.com www.lfa.com;
  • if ($invalid_referer) {
  • return 404;
  • }
  • }
  • //根据文件类型设置过期时间
  • location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
  • if (-f $request_filename) {
  • expires 1h;
  • break;
  • }
  • }
  • // 禁止访问某个目录
  • location ~* \.(txt|doc)${
  • root /data/www/wwwroot/linuxtone/test;
  • deny all;
  • }

###常用隐式全局变量

  • $host 请求主机头字段,否则为服务器名称。
  • $http_user_agent 客户端agent信息
  • $http_cookie 客户端cookie信息
  • $request_method 客户端请求的动作,通常为GET或POST。
  • $content_length 请求头中的Content-length字段。
  • $content_type 请求头中的Content-Type字段。
  • $request_uri 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
  • $uri 不包含请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
  • $document_uri 与$uri相同。
  • $query_string
  • $args 这个变量等于请求行中的参数,同$query_string
  • $document_root 当前请求在root指令中指定的值。
  • $limit_rate 这个变量可以限制连接速率。
  • $request_body_file
  • $request_filename 当前请求的文件路径,由root或alias指令与URI请求生成。
  • $remote_addr 客户端的IP地址。
  • $remote_port 客户端的端口。
  • $remote_user 已经经过Auth Basic Module验证的用户名。
  • $scheme HTTP方法(如http,https)。
  • $server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr 服务器地址,在完成一次系统调用后可以确定这个值。
  • $server_name 服务器名称。
  • $server_port 请求到达服务器的端口号。
  • //例:
  • http://localhost:88/test1/test2/test.php
  • $host:localhost
  • $server_port:88
  • $request_uri:http://localhost:88/test1/test2/test.php
  • $document_uri:/test1/test2/test.php
  • $document_root:/var/www/html
  • $request_filename:/var/www/html/test1/test2/test.php

反向代理

  • 正向代理:代理服务的配置内容在客户端,比如http代理 socks5 vemss,代理端后置于客户端
  • 反向代理:代理的配置在服务端,对用户透明,代理端前置于真实服务器

负载平衡器

  • upstream myserer{
  • server FuzaiUri:xx
  • server FuzaiUri:yy
  • }
  • location / {
  • proxy_pass http://myserver
  • }
  • 策略
    1. 轮询(默认) 如果服务器down掉能自动切换
    2. weight 代表权重,默认为1
      • upstream myserer{
      • server FuzaiUri:xx weight 5
      • server FuzaiUri:yy weight 10
      • }
    3. ip_hash ip分配到hash slot
      • upstream myserer{
      • ip_hash
      • server FuzaiUri:xx
      • server FuzaiUri:yy
      • }
    4. fair(第三方) 根据请求的响应时间分配 响应时间短优先分配
      • upstream myserer{
      • fair
      • server FuzaiUri:xx
      • server FuzaiUri:yy
      • }

动静分离

  • location ^~ /static/ {
  • root /webroot/static/;
  • }
  • location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
  • root /webroot/res/;
  • }