从 Lighttpd 到 OpenResty

两年前,我写了 从Apache到Lighttpd。现在,是时候又发生改变了。

前段时间,我写了许多关于 OpenResty 的文章,并在公司内网服务器和自己的电脑上开始使用 OpenResty。

现在,我开始在外网部署 OpenResty。

编译和安装

OpenResty 的编译和安装就是老三套:

1tar xzvf ngx_openresty-VERSION.tar.gz
2cd ngx_openresty-VERSION/
3./configure
4make
5make install

默认情况下,OpenResy 会安装到 /usr/local/openresty 中,编译时会默认使用 luajit。

我一般会将其安装到 /opt/openresty 中,这就需要指定 --prefix 参数:

1./configuare --prefix=/opt/openresty
2make
3make install

启用 PHP-FPM

以 Ubuntu 14.04 LTS(trusty) 为例,首先安装 php-fpm 。

apt-get install php5-fpm

安装成功后该进程会自动启动,查看状态:

ps aux | grep fpm

输出:

root     10785  0.0  1.8 133624 18308 ?        Ss   14:13   0:00 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data 10787  0.0  1.0 133764 10956 ?        S    14:13   0:00 php-fpm: pool www
www-data 10788  0.0  0.9 133624  9280 ?        S    14:13   0:00 php-fpm: pool www

注意,php-fpm 是使用 www-data 用户权限运行的。

修改 /opt/openresty/nginx/conf/nginx.conf 配置文件,找到下面的内容取消注释:

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
	root           html;
	fastcgi_pass   127.0.0.1:9000
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  html$fastcgi_script_name;
	include        fastcgi_params;
}

默认情况下,会报错:

2015/01/16 14:09:03 [error] 10614#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 59.175.48.91, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "yourname.com:8080"

这是因为,php-fpm 默认没有使用端口监听。查看 /etc/php5/fpm/pool.d/www.conf 可以找到下面的配置:

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

我们可以在这里将 php-fpm 修改成监听端口,也可以直接修改 nginx.conf 配置文件。在这里我采用第二个方案,修改 fastcgi_pass

fastcgi_pass   unix:/var/run/php5-fpm.sock;

重载配置文件:

nginx -s reload

如果出现这样的错误,说明 nginx 进程没有权限访问 sock 。

2015/01/16 14:19:58 [crit] 11022#0: *6 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 59.175.48.91, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "youname.com:8080"

我们注意到前面 php-fpm 是使用 www-data 权限运行的。要解决这个问题,将 nginx worker 进程的权限也改为 www-data 。编辑 nginx.conf :

user nobody; 改为 user www-data;

然后必须使用 nginx -s quit 退出主进程再重启,这个修改才能生效。

(全文完)