配合nghttpx修改nginx配置
上次介绍了用nghttp2软件包中的nghttpx反向代理让普通的网站支持HTTP2协议。在安装配置完成后实际使用的过程中遇到了一些问题,本文总结了一下解决方案。
开始遇到的两个问题是:经过nghttpx转发之后,request header中的host
字段没有了;还有PHP脚本无法得到远端的IP地址。解决第一个问题的方法是在nghttpx的启动参数中加入--no-host-rewrite
来通知nghttpx不要修改host标头;第二个问题可以加入--add-x-forwarded-for
参数来通知nghttpx加入代理转发IP记录。
修改后的启动命令如下:
# nghttpx -D -f *,443 -b 127.0.0.1,80 --add-x-forwarded-for \
--pid-file=/path/to/pidfile.pid --no-host-rewrite --errorlog-syslog \
/path/to/private.key /path/to/certification.crt
加入-D
参数后nghttpx会以守护进程方式运行,加入--errorlog-syslog
可以把错误信息输出到系统的syslog中,而不再使用STDOUT作为错误日志输出;加入--pid-file
之后可以输出一个nghttpx的进程号文件,方便制作成initrc脚本用于管理。
后来又遇到一个问题是,nginx向PHP的fastcgi服务器发送参数时,不知道前面使用了https协议,导致许多PHP项目自动侦测https的代码无法正常工作。这个问题可以修改nginx的配置来解决:
因为nghttpx会在转发的请求头中加入一个X-Forwarded-Proto
标头,所以我们可以在nginx.conf
中加入一个if语句来确认是否使用了https:
# under server or location scope
if ( $http_x_forwarded_proto ~* https ) {
set $var_https on;
}
然后在fastcgi.conf
中修改传给PHP解释器的参数:
#fastcgi_param HTTPS $https if_not_empty;
fastcgi_param HTTPS $var_https if_not_empty;
把原来的https判断方法注释掉,用新的$var_https
参数。如果使用的不是PHP,而是Python,也可以用同样的方式修改uwsgi_params
配置文件。
PS:另外还有一种方法是判断请求标头via
中是否包含nghttpx
字样,如果包含就认为是https访问的,方法和前面的相似就不再赘述。