简介:
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'}";
}
- nginx 内部文件引用
nginx
include path/filename
- 负债均衡
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 的认证
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
- Cache-Control : max-age=31536000
- no-cache 协商
- no-store 不使用
- max-age xx 秒
- public/private 中间服务器能缓存不 (默认:private)
- expires : Sat, 02 Apr 2022 09:08:10 GMT
- pragma : no-cache http1.0 的,只有这个属性 、 优先级最高
协商缓存:
- ETag / If-Not-Match --> 文件签名 (优先级高于 Last-Modified)
- Last-Modified / If-Modified-Since -> 时间
- 前者是响应头的(response 返回的),后者是请求头的(request 发送给服务器去确认的)
浏览器缓存
本地存储
- cookie
- sessionStorage
- localStorage
- IndexDB
默认缓存
往返 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 应用程序中的安全漏洞。
软件的安装及使用
常见的问题列表
- 'ClickJacking' attacks.
- 'nosniff'.
VirusTotal
Trojan:Script/Wacatac.B!ml 或者 特洛伊木马
- 进入网站 选择你要上传的
*.zip
- 如果 VirusTotal 的在线扫描程序返回无恶意(malicious)的结果,您只需在 Windows Defender 中将该文件列入白名单,以剔除该文件即可
BurpSuitePro
Burp Suite Professional 是一套用于测试 web 安全性的高级工具集 —- 所有这些都在一个产品中。从一个基本的拦截代理到尖端的 Burp 扫描器,使用 Burp Suite Pro,正确的工具只需点击一下就可以了。