之前写的一个 yii2 应用一直跑在 apache2 上,最近做压测发现 apache2 的并发处理能力的确差了点,于是想到将应用转移到 nginx 上,以下记录整个迁移过程。
安装 nginx
由于本人用的是 ubuntu16.04 ,只要使用以下命令就能快速安装 nginx 了。
sudo apt-get install nginx -y
由于之前本机安装了 apache2,如果在安装的时候报了一大堆错误,那么很有可能是在运行的 apache2 影响到了安装过程,此时需要先停止 apache2 ,可通过以下命令。
sudo service apache2 stop
nginx 成功安装后,相关的配置目录在 /etc/nginx 。可以通过以下命令来启动 nginx
sudo /etc/init.d/nginx start
此时访问本地 80 端口即可看到 nginx 欢迎页面。
php7.0-fpm 与 nginx
nginx 与 php-fpm 通信有两种方式,一种是通过 TCP,另外一种是 unix socket 。据说两者在一般情况下没有太大差异,但是在高并发情况下,unix socket 方式性能要优异一些。而且,php7.0-fpm 默认使用 unix socket 方式监听请求,这一点可以查看 /etc/php/7.0/pool.d/www.conf 来求证。截取的部分内容如下
从第36行可以看出,php7.0-fpm 的确默认使用的 unix socket 方式的。因此,在 nginx 的配置文件中就必须要使用相应的方式,配置如下
server {
listen 886 default_server;
listen [::]:886 default_server;
root /Myweb/yii2/web;
index index.php index.html index.htm index.nginx-debian.html;
# rewrite route
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location ~ \.php$ {
# include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi.conf;
}
}
以上配置,监听 886 端口,服务器根目录为 /Myweb/yii2/web ,对应 yii2 的入口。 fastcgi_pass unix: /run/php/php7.0-fpm.sock 表示使用 unix socket 方式与 php-fpm 通信。 include 的根目录为 /etc/nginx/。
开启 nginx 的路由重写
以上配置文件中,如下几行起到了开启路由重写的作用。之前看到很多博文说要另写文件去开启路由重写,后来才发现只要在 sever 配置内写入重写规则即可,没必要另外再新建重写文件。
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
rewrite 是路由重写的指令,根据正则表达式的内容,重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
具体的可参考其他博客。
参考链接: