Skip to content

简介:

Nginx 是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少并发能力强

  • 多进程模型,发挥了软硬件的最大性能
  • 事件驱动的异步非阻塞请求处理模型 ,实现高并发处理能力

下载地址

默认 nginx.conf

conf
#user  nobody;  #用户组
worker_processes  1;                             # 只启动一个工作进程
events {
    worker_connections  1024;               # 每个工作进程的最大连接为1024
}
http {
    include       mime.types;                 # 引入MIME类型映射表文件
    default_type  application/octet-stream;   # 全局默认映射类型为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  logs/access.log  main;
    sendfile        on;                     # 启用零复制机制
    keepalive_timeout  65;                  # 保持连接超时时间为65s
    server {
        listen       80;                    # 监听80端口的网络连接请求
        server_name  localhost;             # 虚拟主机名为localhost
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {                        # 匹配规则
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

条件判断

js
server {
  //  if的这个空格不能省
    if ($host = test.jiatingyu.top) {
        return 301 https://$host$request_uri;
    }
    server_name test.jiatingyu.top;
    return 404;
}

内置变量 , 内部变量打印

js
// 官方文档
// https://nginx.org/en/docs/http/ngx_http_core_module.html#variables
// document ---  Modules reference  --- ngx_http_core_module  -- Embedded Variables

// debug-headers.conf 文件
add_header x1-NGINX-http_user_agent $http_user_agent;
add_header xA-NGINX-http_cookie $http_cookie;
add_header xB-NGINX-request $request;
js
location = / {
   include debug-headers.conf;  // 这里就可以把所有自定义的header 写在里面
}

自定义返回格式 html 或 json

conf
      location / {
          # default_type  text/html;
          # return 200 "hello html";
          default_type  application/json;
          return 200 "{'msg':'hello json'}";
      }
  1. nginx 内部文件引用
nginx
 include path/filename
  1. 负债均衡
js
// 三种权重  轮询、weight、ip_hash ;
upstream mysvr {
    server 127.0.0.1:7878 weight=1; //权重
    server 192.168.10.121:3333 weight=2;
    server 192.168.10.121:3333 backup;  //热备  后备服务器,其他坏了才进这个
    // ip_hash;   // # 启用IP哈希负载均衡策略, 相同ip只进相同的服务器
}
location / {

  proxy_pass http://mysvr;
}

nginx htpasswd 的认证

httpd 在线下载

conf

server {
    listen 80;
    #  所有路径都加验证
    ; auth_basic "请输入用户名和密码";
    ; auth_basic_user_file  ../jty;
    location / {
      include debug-headers.conf;
    }
    location /api/ {
      # 只对api进行限制,文件相对于nginx的conf目录
      auth_basic "请输入用户名和密码";
      auth_basic_user_file  ../jty;
      proxy_pass http://47.105.202.15:8077/;
    }
}

静态文件索引

conf
    server {
        listen 80;
        location / {
            root D:/download/;
            sendfile on;   # 开启高效文件传输模式(零拷贝)
            autoindex on;  # 开启目录文件列表
            autoindex_exact_size off;  # 显示出文件的确切大小,单位是bytes
            autoindex_localtime on;  # 显示的文件时间为文件的服务器时间
            charset utf-8,gbk;  # 避免中文乱码
        }
    }

路径别名

conf
    location /file/ {
        alias E:/nginx-1.24.0/html/;
        index index.html;
    }

IP 限制

conf
  location ~ /js/ {
        root html;
        index index.html;
        try_files $uri $uri/ /index.html;
        # 标识除了允许的,其他的全部拒绝(---位置不能换---),如果有多个就复制行 , 0/8 是指统配前三位 、16 前两位 、24 前一位
        allow 192.168.124.0/24;
        deny all;  #拒绝的ip
  }

return、rewrite 和 try_files 指令

conf
    location / {
        # 强制https
        rewrite ^(.*)$ https://$host$1 permanent;
    }
    location /api1/ {
        # 302 重定向
        return http://baidu.com;
    }
    location /api2/ {
        # 重写url
        rewrite ^/api/(.*)$ http://xxxxx:8077/$1 break;
    }
    location /api3/ {
        # 反向代理 不重写
        proxy_pass http://xxxxx:8077/;
    }

location 规则

  • =:精确匹配,优先级最高。如果找到了这个精确匹配,则停止查找。
  • ^~:URI 以某个常规字符串开头,不是正则匹配
  • ~:区分大小写的正则匹配
  • ~*:不区分大小写的正则匹配
  • /:通用匹配, 优先级最低。任何请求都会匹配到这个规则

优先级为: = > 完整路径 > ^~ > ~、~* > /

网站安全

conf
  location / {
    add_header X-Frame-Options SAMEORIGIN;
        # https://wangshuashua.com/nginx-configcspcontent-security-policy 参考文档
    # add_header Content-Security-Policy "default-src 'self'; script-src 'self' *.amap.com *.qq.com *.jquery.com *.bdimg.com; connect-src 'self'; img-src 'self' data:; style-src 'self';frame-ancestors 'none'; form-action 'none';";
    add_header Content-Security-Policy "default-src 'self' 125.65.86.164:9001 'unsafe-inline';script-src 'self' 'unsafe-eval' unpkg.com;img-src 'self' data: ";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options nosniff;
    add_header Strict-Transport-Security "max-age=31536000; preload; includeSubDomains" always;
  }

Https

conf
server {
     #SSL 默认访问端口号为 443
     listen 443 ssl;
     #请填写绑定证书的域名
     server_name xx.jiatingyu.top;
     #请填写证书文件的相对路径或绝对路径
     ssl_certificate xx.jiatingyu.top.crt;
     #请填写私钥文件的相对路径或绝对路径
     ssl_certificate_key xx.jiatingyu.top.key;
     ssl_session_timeout 5m;
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
     ssl_prefer_server_ciphers on;
     location / {
         #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
         #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
         root html;
         index  index.html index.htm;
     }
 }

代理 wss

conf
    location /wss/ {
            proxy_pass http://xxxx:9884/mqtt/;
            proxy_set_header Sec-WebSocket-Protocol mqtt;
            proxy_http_version 1.1;
            proxy_set_header Upgrade websocket;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-real-ip $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_read_timeout 86400s;
            proxy_send_timeout 86400s;
    }

前端缓存

网络缓存:

解决时间问题:

  • HTTP 1.0 规定使用 Expires 指定一个绝对时间,但不同地区使用的时区不同时间手动可以被修改
  • HTTP 1.1 使用 Cache-Control 指定一个相对时间,也就是距本次响应 xxx 秒后过期,解决了 Expires 的问题

解决文件内容的问题:

  • Last-Modified 上次修改时间,有时我们修改并撤销或定期修改,但是文件的内容并没有发生变化, If-Modified-Since
  • ETag:文件内容的 hash 算法 , If-Not-Match

到达缓存时间限制后的逻辑:

请求的时候携带上 If-Modified-Since、If-None-Match

  1. Cache-Control : max-age=31536000
    • no-cache 协商
    • no-store 不使用
    • max-age xx 秒
    • public/private 中间服务器能缓存不 (默认:private)
  2. expires : Sat, 02 Apr 2022 09:08:10 GMT
  3. pragma : no-cache http1.0 的,只有这个属性 、 优先级最高

协商缓存:

  1. ETag / If-Not-Match --> 文件签名 (优先级高于 Last-Modified)
  2. Last-Modified / If-Modified-Since -> 时间
  3. 前者是响应头的(response 返回的),后者是请求头的(request 发送给服务器去确认的)

浏览器缓存

  1. 本地存储

    • cookie
    • sessionStorage
    • localStorage
    • IndexDB
  2. 默认缓存

    • 往返 BFCache ( back-forward cache,可称为“往返缓存”,浏览器前进后退的缓存) fireFox 和 opera 才有

    • 这样不会触发 onload 事件,监听 pageshow , pagehide 事件 来触发

conf

#    nginx 缓存配置
server {
    location ~* \.(html)$ {
        access_log off;
        add_header Cache-Control max-age=no-cache;
    }
    location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
        access_log off;
        add_header Cache-Control max-age=360000;
    }
}

漏洞扫描工具

OWASP ZAP (Zed Attack Proxy)

Zed Attack Proxy(ZAP)是最流行的开源 Web 应用程序安全测试工具之一。它由 OWASP 开发,旨在在开发和测试应用程序时自动检测 Web 应用程序中的安全漏洞。

软件的安装及使用

渗透测试工具 ZAP 入门教程(非常详细)

常见的问题列表

  • 'ClickJacking' attacks.
  • 'nosniff'.

VirusTotal

在线地址

Trojan:Script/Wacatac.B!ml 或者 特洛伊木马

  1. 进入网站 选择你要上传的 *.zip
  2. 如果 VirusTotal 的在线扫描程序返回无恶意(malicious)的结果,您只需在 Windows Defender 中将该文件列入白名单,以剔除该文件即可

BurpSuitePro

Burp Suite Professional 是一套用于测试 web 安全性的高级工具集 —- 所有这些都在一个产品中。从一个基本的拦截代理到尖端的 Burp 扫描器,使用 Burp Suite Pro,正确的工具只需点击一下就可以了。

安装包下载