4

nginx 是一款具有高负载能力的 web 服务器,也是 LNMP 架构的主要角色之一。现在越来越多的开发者选择 nginx 作为 php 的好搭档,替代 apache 的位置。下面我以 Mac 系统为例,介绍下 nginx 的配置

基本配置

打开 nginx.conf,找到 http 下的 server,前几行的内容分别是:

listen  8080;                #监听端口
server_name  localhost;      #本地域名
root  /usr/local/var/www;    #项目根目录

nginx 默认监听8080端口,你可以改成 80 端口。默认项目根目录也可以更改。不过更改之后要重新载入配置文件才能生效:

sudo nginx -s reload

注意:如果你不喜欢localhost,你想要一个个性的本地域名,比如www.test.com,首先要编辑 hosts 文件:

sudo vim /etc/hosts

添加一条:

127.0.0.1     www.test.com

然后修改 nginx.conf:

server_name    www.test.com

总之 nginx.conf 中设置的域名,必须在 hosts 文件中存在!


隐藏入口文件

在我们开发项目的时候,一般会有隐藏入口文件的需求。依然是在 http 下的 server,我们找到location /,在大括号内做修改。切记ci框架和tp框架的写法稍有不同,具体如下:

location / {
       index  index.php index.html index.htm;
       if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?$1 last;    #ci框架写法
            #rewrite ^/(.*)$ /index.php?s=/$1 last;    #tp框架写法
            break;
       }
}

如果你用的是tp5, 入口文件在 public 目录下,但是你不想在URL中写localhost/public/访问入口文件,你想直接通过localhost/访问,你可以这样写:

rewrite ^/(.*)$ /public/index.php?s=/$1 last;

其实隐藏入口文件就是 nginx 做了下路由,看懂它的正则,其实不难理解。


解析php

如果要 nginx 正常解析 php,首先要在安装好 php 之后,启动 php-fpm。启动方法:

sudo php-fpm -D

上一步完成之后,接下来还是要修改 nginx.conf。server 下找到location ~ \.php$这一行,包括它后面{}中的内容,去掉注释,也就是去掉前面的#号,修改成这样:

location ~ \.php(\/.*)*$ {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

      fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
      fastcgi_param  PATH_INFO  $fastcgi_path_info;
      fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
      include        fastcgi_params;
}

如图:

clipboard.png

重新载入配置文件。此时 nginx 就可以配合 php-fpm 正确解析 PHP 了。


多站点设置

前面我们修改配置文件的代码位置,都是在 http 下的 server 里。其实一个 server 就相当于一个站点。nginx.conf 下 http 模块默认开启一个 server,就是只有一个站点。如果我们要多站点,就需要添加多个 server。

现在我们要添加一个站点,假设这个站点的域名是 www.test2.com, 但是 server 不写在 nginx.conf 里。nginx 为我们提供了存放多站点配置文件的目录,我们切换到这个目录:

cd /usr/local/etc/nginx/servers/

然后新建配置文件:

vim www.test2.com.conf

里边写一个 server:

server {

    listen  80;
    server_name  www.test2.com;

    index  index.html index.php;

    root  /usr/local/var/test2;

    location / {
         index  index.php index.html;
         rewrite ^/(.*)$ /public/index.php?s=/$1 last;
         break;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include        fastcgi_params;
    }
    
}

保存退出,重新载入配置文件。最后在 hosts 中添加:

127.0.0.1   www.test2.com

此时,www.test2.com 就可以访问到你的新项目目录 /usr/local/var/test2下了!


反向代理设置

我的应用场景是这样的。假设我的服务器上存放着一个 node 项目,node 占用着80端口,可以正常运行。但是我想再放一个 php 项目,此时这个php项目就不能是80端口了。如果想 node 项目和 php 项目均适用80端口,则需要利用 nginx 做反向代理设置。

解决方案是,node 项目设置成非 80 端口,比如3000,nginx 添加一个站点,假设是www.test3.com,访问 80 端口,代理到 3000 端口即可。

设置方法如上一节添加新站点:

cd /usr/local/etc/nginx/servers/

然后新建配置文件:

vim www.test3.com.conf

写入一个 server:

server {
    listen 80;
    server_name www.test3.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

访问 www.test3.com,就可以访问到 node 项目了!


本文由 杨成功 原创,更多原创内容请到专栏 杨成功的全栈之路


杨成功
3.9k 声望12k 粉丝

分享小厂可落地的前端工程与架构