分类
服务器部署

在 windows 上编译 nginx,以使用 nginx-rtmp-module 模块

注:这是一个客户需求,本文仅做记录。实际使用中不建议在 windows 上使用 nginx ,因为 windows 上的 nginx 至今还是 select 模型,没有 IOCP ,不堪重负。

操作系统:Windows 7 SP1(虚拟机环境)
编译工具:Visual Studio 2010(主要是使用其编译工具)

准备工作

  • 安装 Strawberry Perl: windows 版本的 perl
    下载地址:https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-32bit.msi

下载依赖包:pcre,zlib,openssl

pcre 下载地址:https://ftp.pcre.org/pub/pcre/
这里下载的是8.45版本

zlib 下载地址:https://zlib.net/
这里下载的是1.2.11版本

openssl 下载地址:https://www.openssl.org/source/
这里下载的是openssl-1.1.1l版本

因为要用到 rtmp 模块,所以,这里额外下载 rtmp 模块代码
nginx-rtmp-module 下载地址:https://codeload.github.com/arut/nginx-rtmp-module/zip/refs/tags/v1.2.2
下载最新的1.2.2版本

开始编译

打开 mysys2 ,使用 hg 下载最新的 nginx 源代码,执行命令:

hg clone http://hg.nginx.org/nginx

在 nginx 源码目录下新建目录 ojbs/lib ,把下载好的依赖包放到该目录中,如下图:

objs/lib目录下解压好的文件

在 mysys2 中安装编译工具:

pacman -S gcc make

执行如下命令,用来生成 makefile 文件:

auto/configure \
    --with-cc=cl \
    --with-debug \
    --prefix= \
    --conf-path=conf/nginx.conf \
    --pid-path=logs/nginx.pid \
    --http-log-path=logs/access.log \
    --error-log-path=logs/error.log \
    --sbin-path=nginx.exe \
    --http-client-body-temp-path=temp/client_body_temp \
    --http-proxy-temp-path=temp/proxy_temp \
    --http-fastcgi-temp-path=temp/fastcgi_temp \
    --http-scgi-temp-path=temp/scgi_temp \
    --http-uwsgi-temp-path=temp/uwsgi_temp \
    --with-cc-opt=-DFD_SETSIZE=1024 \
    --with-pcre=objs/lib/pcre-8.45 \
    --with-zlib=objs/lib/zlib-1.2.11 \
    --with-openssl=objs/lib/openssl-1.1.1l \
    --with-openssl-opt=no-asm \
    --with-http_ssl_module \
    --add-module=objs/lib/nginx-rtmp-module-1.2.2

执行完成之后,打开 Visual Studio 2010 命令提示行,进入 nginx 源码目录,执行命令:

nmake -f objs/Makefile

接下来就是等待编译完成。

编译完成之后,会提示找不到命令 sed ,不用理会。

编译完成,找不到 sed 忽略即可。

最后,到 objs 目录下找到新鲜出炉的 Nginx.exe 。

编译生成的 nginx

运行

为了让编译后的 Nginx.exe 能运行起来,我们需要到 Nginx 官网下载一个官方编译的压缩包,解压后,把我们生成的 Nginx.exe 替换官方的即可。

官方编译好的 nginx for windows 二进制文件
最终的目录结构。
分类
服务器部署

PHP-FPM和Nginx使用Unix Domain Socket通讯

  • 第一步,创建 unix domain sock 文件
cd /run
mkdir php && cd $_
touch php7.4-fpm.sock
chown www-data:www-data php7.4-fpm.sock
chmod 777 ./php7.4-fpm.sock
  • 第二步,配置 php-fpm
cd /usr/local/php/php74/etc/php-fpm.d
vi www.conf

listen = 127.0.0.1:9074
改为
listen = /run/php/php7.4-fpm.sock

保存后,执行systemctl restart php7.4-fpm重启 php-fpm 。

  • 第三步,配置 nginx
fastcgi_pass 127.0.0.1:9074;
改为
fastcgi_pass unix:/run/php/php7.4-fpm.sock;

保存后,执行nginx -s reload使 nginx 配置生效。

P.S. 可以把 Unix Domain Socket 文件放到 /dev/shm 下以提高性能。因为这个目录不在硬盘上,而是在内存里。

Yet another post script: 这么改完之后,一定记得所有用到这个 PHP-FPM 的站点,nginx 配置都要做如上修改,不然网站就访问不了了。

分类
Web

HSTS引发子域名HTTP强制跳转HTTPS

由于当前这台服务器带宽和流量比较充足,CN2线路质量还算可以,所以打算建一个子域名,专门用来中转下载。

域名使用的是本站的一个二级域名,但是建好后,却发现子域名始终强制跳转到https协议。经过排查和查询资料,发现原来是HSTS(HTTP Strict Transport Security)在作怪。当初在配置本站的ssl证书时,在nginx配置中加了这样一句话:

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

这句话在http响应头中添加一条Strict-Transport-Security信息,意思是告诉浏览器当前网站支持HSTS,即当使用HTTP协议访问本站时,将强制跳转到HTTPS协议。对于chrome浏览器来说,当发现网站支持HSTS时,会把这个域名加入浏览器内部维护的一个支持HSTS的网站列表中。这样,第二次使用HTTP访问这个网站时,将不经过服务器跳转,而是直接通过浏览器进行跳转,跳转的HTTP状态码是307。查询资料得知,这种跳转比301和302跳转更安全,而且由于少了一次服务器请求,还可以减轻服务器的压力。

很明显,在这个配置中includeSubDomains的意思是对子域名也进行跳转,所以才会出现新部署的子域名强制跳转HTTPS的问题。

找到了原因之后,本来想去掉includeSubDomains这一项,但一想,去掉之后,就只有裸域可以使用HSTS跳转了,对于www还是要用301跳转,不如干脆全部使用301好了。所以就禁用掉了主站的HSTS。在add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";前面加#注释掉。

禁用之后,清空浏览器缓存,刷新网站,果然可以了。只有主站使用301跳转HTTPS协议,子站仍然可以使用HTTP协议,问题解决。

补充知识:

chrome浏览器可以通过chrome://net-internals/#hsts页面的Query Expect-CT domain这一项来查询某网站是否被加入了chrome内部的HSTS网站列表。如果想删除,可以通过最下面的Delete domain security policies这一项来删除,输入域名,然后点击Delete按钮就好了。如下图:

chrome浏览器的HSTS配置页面