标签 nginx 下的文章

nginx+php启用quic即http/3的方法

本站已支持http/3。
屏幕截图 2021-11-03 095321.png
支持HTTP/3

http/3quic参考wiki。

1.QUIC简单流程介绍
当浏览器向之前从未发过请求的服务端发出请求时,它不知道对方是否支持QUIC,因此先通过TCP发送第一个请求。服务器响应该请求以后,要发送 Alt-Svc 的HTTP响应头告诉浏览器它支持QUIC。浏览器知道服务端支持 QUIC后尝试使用 QUIC 来进行下一个请求。浏览器下一个请求采取QUIC和TCP竞争的方式与服务端建立连接,如果请求通过TCP发出,TCP赢得竞争,请求将通过TCP发出。后续如果QUIC连接成功,之后所有请求都将通过QUIC连接发送。
当浏览器向之前使用过QUIC的服务器发出请求时,它还会与TCP进行竞争。 对于启用QUIC并支持0-RTT握手的服务器,由于浏览器将能够进行0-RTT握手,因此QUIC还会立即获胜,并且继续在QUIC连接上发出请求。
如果QUIC握手失败,则浏览器会将QUIC标记为该主机broken。后续请求都将通过TCP重新发送。5分钟后,broken的QUIC标记为recently broken。当向服务器发出下一个请求时,浏览器又将继续让TCP和QUIC进行竞争。由于QUIC recently broken,因此将禁用0-RTT握手。如果握手再次失败,则QUIC将在此次再次标记为该连接已损坏10分钟,将QUIC标记为已损坏的前一周期的2倍,如此往后都会不断的标记为2倍。如果握手成功,请求将通过QUIC发送,QUIC将不再标记为recently broken。

2.浏览器启用QUIC或者HTTP/3
chrome浏览器,地址栏打开chrome://flags,搜索quic,Experimental QUIC protocol选择enabled,重启浏览器。edge等chromium内核浏览器类似。
safari浏览器,实验功能,启用HTTP/3,重启浏览器。
打开https://http3.is或者https://quic.nginx.org或者https://cloudflare-quic.com可以检查浏览器是否能使用quic。
chrome可以安装QUIC indicator插件检测网页是否以quic打开。

3.网站配置
启用http/3或者quic需要反代服务器支持即可,即nginx,caddy等支持http/3。nginx官方主线版本还未支持,可以使用cloudflare的插件quiche重新编译nginx源码实现支持。caddy可以通过实验功能开启http3,但是截至v2.4.5版还存在问题
所以这里使用docker-nginx-http3替换原nginx。
配置文件需要参考作者提供的nginx.conf和h3.nginx.conf

systemctl stop nginx
apt update
apt install docker.io
docker pull ranadeeppolavarapu/nginx-http3
docker run -d -t --restart always --name "nginx-http3" -p 80:80 -p 443:443/tcp -p 443:443/udp -v /var/run/php:/var/run/php -v [映射nginx的配置文件,网页代码文件,证书等] ranadeeppolavarapu/nginx-http3

修改php-fpm监听的unix socket的权限,修改www.conf的listen.mode = 0666,给映射进容器的php7.2-fpm.sock赋予权限。
然后重启php-fpm服务。

4.检查网站是否启用HTTP/3
https://http3check.net/

5.其他
quic使用的端口号需要和tcp相同,否则网页地址会变,网页会出现跨域问题。
通过使用chrome的quic indicator插件发现很多网站都启用了http/3,尤其使用cloudfare CDN的网站,比如www.google.com,youtube.com,cloudflare.com,whatismyipaddress.com,whatismyip.com,ip.sb等

记录一个nginx的301或者rewrite的坑

http跳转到https一般使用301或者rewrite,但是在post到http时,按照http标准,收到301后会变成get https,一般调用接口会出现这个问题,简单不完美的解决办法是使用303或者307跳转。

nginx跨根目录rewrite配置

最近遇到了一个nginx配置难题
一个路由使用的不是root配置的根目录,然后还需要跳转,一下卡了一个月,幸亏不着急,昨天总算解决了

server {

listen 443 ssl;
server_name example.com;
root /www/current/public;

...

location ^~ /nginx/test/ {
    alias /home/test/nginxtest/;
    try_files $uri $uri/ /nginx/test/index.html;
    }

...

问题出在alias上,下面的location里使用root的话会在访问example.com/nginx/test会去找/home/test/nginxtest/nginx/test/index.html,相当于把路由插到路径里面了,使用alias就会直接找/home/test/nginxtest/index.html。需求是在访问example.com/nginx/test/{任意字符串}rewrite到example.com/nginx/test/index.html,而使用alias不支持rewrite,问题就出在这,虽然有很多解决办法,如后端改写路由等,但都不够完美。
nginx上一种解决办法是在前面插入一个location,rewrite到这个

location /nginx/test {

rewrite /nginx/test(.*) /test/index.html last;

}

location /test/ {

alias /home/test/nginxtest/;

index index.html;

}

但是这有个问题就是原来目录下的其他文件不能载入,如.js,.css,图片等,虽然可以使用if来解决但是都太麻烦

后来想到了try_files这个配置

一开始配置try_files $uri $uri/ /index.html
发现还是404,查看log发现找的文件是/www/current/public/index.html,去找根目录的index.html
这时隐隐感觉可以在index.html前插入路由/nginx/test/可以,因为之前在哪看到过nginx是会先找路径然后找路由,都没有才会返回404.
修改之后成功。访问example.com/nginx/test/{任意字符串},浏览器显示的还是example.com/nginx/test/{任意字符串},但是上找到文件是/home/test/nginxtest/下的index.html和js等文件。

以上方法只适用于一级路由,多级路由不行

更新配置

location ~ \.(js|jpg|jpeg|png|bmp|swf|css|ico)$ {
    rewrite (.*)/((.*)\.(js|jpg|jpeg|png|bmp|swf|css|ico))$ /$2 break;
}

location /api/v1 {
   proxy_pass https://eexample.com/api/v1
}

location / {
    try_files $uri $uri/ /index.html;
}

说明:
第一个location捕获js,css等静态文件
第二个location捕获api后台接口
第三个location捕获index.html

alias不能用于if和location @{字符串}字段

ps:如果报500错误,log里出现rewrite or internal redirection cycle,是因为找不到index.html文件

记录一下2016年8月willnet.net迁移

这个美国服务器选的是ubuntu16.04,默认安装了apache2,对apache不熟悉,偷懒想apache简单配一下也能凑合用,大不了关了https。
途中遇到502,原因是php7的apache2 的module没装,apt-get安装后重启服务可以了,想着letsencrypt可以auto自动配置apache的证书,结果不行。而且chrome访问老是跳到https,然后无法访问。
最后还是安装了nginx,从香港服务器拷贝过来的配置文件不是很匹配,香港服务器使用的是oneinstack一键脚本安装的,配置文件路径和用apt安装的不一致,修改后还是不行,出现502,排查发现是fastcgi的socks路径不对,修改之后成功。
总之,一键脚本是方便,但是也有很多坑,现在大部分软件都有自己的源,完全可以用apt方式安装最新版,没有太大必要编译安装,而且自己写conf也有助于理解软件逻辑。

网站内容直接mysql导出数据库,新服务器导入即可