Total Pageviews

Sunday, 6 September 2015

配合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用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访问的,方法和前面的相似就不再赘述
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访问的,方法和前面的相似就不再赘述.