WEB容器
HTTP重定向HTTPS
1 | server { |
或者
1 | server { |
静态页面+SSL
文件_school.psvmc.cn.conf
1 | server { |
服务器上测试
1 | curl -H "Host: school.psvmc.cn" http://127.0.0.1 |
其中:
-k 参数用于忽略自签名证书的验证警告。
SSL核心配置
1 | listen 443 ssl; |
文件下载
1 | server { |
关键语句
add_header ‘Content-Type’ ‘application/octet-stream’;
Vue history模式
在使用 Vue 的 history 模式时,由于前端路由是通过修改 URL 来实现的,所以在部署到服务器上时,需要进行一些特殊的配置才能确保正常访问。
以下是一个常见的配置流程:
Nginx添加配置:
在 Nginx 的配置文件中,添加一个用于处理前端路由的 location 配置,
如下所示:
1 | location / { |
这个配置将会重定向所有请求到 index.html,这样访问任何一个路由都会返回同一个首页。
然后 Vue Router 会根据 URL 来动态加载相应的组件。
保存并重新启动 Nginx 服务,使配置生效。
禁用缓存
前端项目使用VUE开发的都是单页,也就是只有一个html文件,但是每次更新可能因为用户缓存,而无法正常访问,所以建议html不进行缓存。
如果HTML文件较小建议直接禁用缓存
1 | # html不缓存 解决前端更新缓存问题 |
如果HTML文件较大建议使用协商方式
1 | # html协商缓存 解决前端更新缓存问题 |
对比:
Pragma: no-cache:和Cache-Control: no-cache区别
Pragma: no-cache跟Cache-Control: no-cache作用相同Pragma: no-cache可以应用到http 1.0 和http 1.1Cache-Control: no-cache只能应用于http 1.1.
Cache-Control: no-cache和Cache-Control: no-store区别
看字面意思容易误解,no-cache就是不缓存,但是no-cache并不是不缓存,而是使用协商缓存,所以并不能禁止缓存,no-store才是真正的禁止缓存。
从节省带宽角度讲,使用no-cache更优一点,文件未发生改变时只传输很小的报文大小,只有在文件改变时才会传输整个文件大小。而不是no-store不管什么情况都传输整个文件大小。
GZIP压缩
server下添加
1 | # gzip |
添加日志
1 | server { |
允许跨域访问
可以配置 server 下,当前 server 的所i有地址生效。
也可以配置在 location 中,只对当前配置的地址生效。
核心配置
1 | add_header 'Access-Control-Allow-Origin' '*'; |
注意OPTIONS返回200也是可以的,但是返回204会更符合规范。
1 | add_header 'Access-Control-Allow-Origin' '*'; |
反向代理
反代接口+SSL
1 | server { |
允许跨域
注意:
如果接口本身已经允许跨域了,那么不要配置Nginx,配置后反而会报跨域错误。
示例
1 | server { |
核心配置
1 | add_header 'Access-Control-Allow-Origin' '*'; |
注意OPTIONS返回200也是可以的,但是返回204会更符合规范。
1 | add_header 'Access-Control-Allow-Origin' '*'; |
也可以这样写
1 | location / { |
允许指定域
1 | location / { |
响应头无法获取
1 | # 暴露给客户端的响应头(自定义头需要在这里声明) |
对比
| 响应头 | 作用 | 适用场景 |
|---|---|---|
Access-Control-Allow-Headers |
允许客户端在请求中使用哪些自定义头 | 当客户端发送的请求包含非简单头(如 Authorization、X-Custom-Header)时,用于告知浏览器服务器接受这些头 |
Access-Control-Expose-Headers |
允许客户端访问响应中的哪些自定义头 | 当服务器返回的响应包含自定义头(如 X-Total-Count、X-Pagination)时,用于告知浏览器客户端可以通过 JavaScript 读取这些头 |
负载均衡
1 | upstream a_psvmc { |
反代WS
1 | upstream wsexam { |
相比之前配置的HTTP代理 主要增加了以下配置
1 | proxy_http_version 1.1; |
反代流式接口
1 | server { |
主要配置
proxy_buffering off:对于流式接口,必须将代理缓冲关闭,这样 Nginx 会立即将接收到的数据转发给客户端,而不是先缓存起来,从而保证数据的实时性。
无法获取IP
1 | location /ws/ { |
注意
只有建立连接的时候才能获取到IP。
获取IP
1 | ws.on('connection', function connection(ws, req) { |
Java
1 | String address = session.remoteAddress().toString(); |
分别取到的地址为
address: 127.0.0.1:48630
host: sockettest2.xhkjedu.com
xrealip: 123.14.108.207
xforwardedfor: 123.14.108.207
其中X-Real-IP和X-Forwarded-For获取到的是用户的IP。
大文件上传
添加在server节点下
如果主要处理小文件上传(几十兆以内)
可以参考以下设置:
1 | client_max_body_size 50m; |
如果需要支持大文件上传(几百兆甚至上 GB)
可以参考以下设置:
1 | http { |
每个参数的意思:
client开始的参数是客户端到Nginx的配置。
proxy开始的参数是Nginx到反代服务的配置。
client_max_body_size
限制请求体的大小,若超过所设定的大小,返回413错误。
client_header_timeout
Nginx 从客户端接收请求头(header)的最大时间。请求头包含了诸如请求方法、请求的 URL、客户端信息等内容。若超时返回408错误。
client_body_timeout
设置读取客户端请求体的超时时间,包括连接建立后读取第一个请求体数据包的超时时间以及两次连续读取请求体数据包之间的超时时间。
在接收到完整的请求头后,Nginx 开始接收请求体。若超时返回413错误。
proxy_connect_timeout
Nginx与上游服务器(被代理的服务器)建立连接所允许的最长时间。默认为60秒,官方推荐最长不要超过75秒。
proxy_read_timeout
Nginx 从上游服务器读取响应数据的最长时间间隔。默认60秒。
proxy_send_timeout
Nginx 向上游服务器发送请求数据的最长时间。默认60秒。
send_timeout
Nginx 向客户端发送响应数据的最长时间间隔。计时起始点是 Nginx 向客户端发送响应数据的第一个字节之后。
注意:
大文件上传费时的是文件到代理服务器(Nginx)的时间,所以
proxy_xxx相关的时间不用配置的过长
代理Mysql/远程连接/SSH
详细文章查看:https://www.psvmc.cn/article/2020-12-31-nginx-tcp.html
配置:
1 | stream { |
注意该配置要和http同级
动静分离
1 | upstream filetest_psvmc { |
注意
20行的代码root的路径
不要配置为/data/wwwjarapi/8905xhkjfileapitest/static/否则会在
static文件夹下再查找static文件夹
正向代理
1 | server { |
测试
1 | curl -I --proxy 192.168.10.10:1080 www.baidu.com |
重定向
GET请求
301重定向
1 | location = /static/应用.apk { |
规则路径是可以支持中文的。
重写
主要用于地址迁移 重定向到新的地址
1 | server { |
主要配置是
1 | location /userapi/login { |
注意
rewrite是302重定向,会把post请求重定向为get请求。
POST请求
307重定向
- 301 永久重定向,告诉客户端以后应从新地址访问.
- 302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found. 现在使用只是为了兼容性的处理,包括PHP的默认Location重定向用的也是302.
但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化
- 303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
- 307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。
大部分浏览器 302 会将 POST 请求转为 GET,所以使用307重新发起请求。
1 | location ~ ^/userapi/login { |
反代
1 | location ~ ^/userapi/login { |