2016-06-09

在windows下用WSL编译运行openresty

EDIT: 之前写了篇如何在cygwin下编译openresty,但现在没必要了,所以有了这篇如何用Bash on Windows编译。

如果你的开发机是windows,想要用openresty的话,你需要在windows下编译openresty。cygwin编译会遇到各种问题,启动也不方便,现在我们可以用Bash on Windows(Windows Subsystem for Linux)来做的更好。

首先你要安装到Win10。什么?你还不是Win10? 虽然普通用户会抱怨Win10不习惯,但这只是他们不愿接受新事物,对开发人员来说,你没有什么好犹豫的。

Win10 14316以上版本才有Bash on Windows,目前已包含到周年更新中,只要你更新到了最新版就有。

安装Bash on Windows

首先打开 设置->更新和安全->针对开发人员->开发人员模式。

然后打开启动或关闭Windows功能(按Win键,输入 Windows功能 搜索,第一个结果就是),选上适用于 Linux 的 Windows 子系统,重启。

最后,按Win键,输入cmd回车打开控制台,输入bash,就会开始安装了。过程中你需要输入linux的用户名和密码(仅用于Bash on Windows),出来提示符就完成了。

需要的话,你可以把你的用户密码给删了,省得sudo时麻烦(反正用lxrun命令进入bash的root都不用密码)。

安装Openresty

Bash on Windows就是Ubuntu 14,所以你按照Openresty官网指示的方法安装就行了,目前对nginx有些兼容性问题,但可以绕过,未来版本应该会解决。

VERSION替换成最新的openresty版本。

#!/bin/sh
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make
wget https://openresty.org/download/openresty-VERSION.tar.gz
tar xzvf openresty-VERSION.tar.gz
cd openresty-VERSION/
sudo ./configure --with-http_stub_status_module --with-pcre-jit
make -j8
sudo make install

将编译成Linux的ELF格式的执行文件,在Windows里直接运行(非虚拟机)。

绕过当前版本对Nginx的兼容问题

  1. 无法启动,会提示你:failed while spawning "worker process" (22: Invalid argument)。 在conf文件里加上master_process off;可以绕过问题。

  2. 传输大文件有问题,发送大于1M的content到384k就停了,浏览器显示 ERR_CONTENT_LENGTH_MISMATCH,服务器Log会显示 client timed out (110: Connection timed out) while sending response to client 绕过方法是http下加上output_buffers 2 10m;,10m替换成你最大需要传输的数据大小。

已回报社区,期待解决。

运行Openresty

现在你可以直接在Windows中启动Openresty了,建个快捷方式,输入

bash -c "/usr/local/openresty/nginx/sbin/nginx -c /mnt/c/www/nginx_dev.conf'

我这里conf文件放在c:/www/nginx_dev.conf,你可以替换成你自己的,建议conf文件加上:

daemon off;

以前台方式运行。

大功告成。

如果你需要使用其他库,和Ubuntu一样,可以直接apt里下载使用,或者直接cpy二进制使用,不用重新编译。

其他问题

由于是beta版,还有各种bug和兼容性问题。

我遇到过运行bash返回0x80070020错误,目前这个bug的issues已经open,应该几个版本后会解决。 原因是某个文件lock后未unlock,导致再次打开无法访问,遇到这个bug只能先重启。

另外Bash on Windows下systemtap可以编译,但没有对应的debug symbol,不知道这种架构能否做到提供dbgsym运行systemtap,如果可以实现,那就更方便了。


回主页