但行好事,莫问前程

挖了太多坑,一点点填回来

CakePHP 的 Nginx 设置

cakephp, linux, nginx, php

在自己的笔记本上弄了个 CakePHP + Nginx 的组合,做了基本设置。

由于 80 端口已经被 Apache 占用,因此我指定 Nginx 监听 81 端口。

首先记得安装 Nginx 和 PHP5-FPM 模块:

1
$ sudo apt-get install nginx php5-fpm

然后记得编辑 /etc/php/fpm/php.ini ,并设置 cgi.fix_pathinfo=0,接着重启 php-fpm

将 CakePHP 作为独立网站配置

下面是将 CakePHP 作为一个单独的主机进行配置的 Nginx 配置文件。

/etc/nginx/sites-available/cakestrap.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
server {
    # 监听 81 端口
    listen 81;
    # 配置本地域名 cakestrap.local
    server_name cakestrap.local;
    # 将这个域名下所有的请求重写到 www.cakestrap.local
    rewrite ^(.*) http://www.cakestrap.local:81$1 permanent;
}

server {
    listen 81;
    # 配置本地域名 www.cakestrap.local
    server_name www.cakestrap.local;

    # 设置 $document_root
    root "/home/caiknife/source/cakestrap/app/webroot/";
    index index.php;
    access_log /var/log/nginx/cakestrap.local.access.log;
    error_log /var/log/nginx/cakestrap.local.error.log;

    # 解析根目录
    location / {
        # 尝试将请求 $uri 解析为文件或者目录,如果都不是的话,重写到根目录下的 index.php 
        try_files $uri $uri/ /index.php?$uri&$args;
    }

    # 解析 PHP 文件
    location ~ \.php$ {
        # 请求文件,如果失败的话,显示404。
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        # 这里用 php fpm 模块比传统的 fast cgi 模块要快
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
    }
}

接着建立软链接,并测试 Nginx 配置语法是否正确:

1
2
$ sudo ln -s /etc/nginx/sites-available/cakestrap.conf /etc/nginx/sites-enable/cakestrap.conf
$ sudo nginx -t

如果语法正常没有错误的话,就重启 Nginx :

1
$ sudo service nginx <reload|restart>

编辑 /etc/hosts ,加入两行: 127.0.0.1 cakestrap.local127.0.0.1 www.cakestrap.local 。之后就可以在浏览器里直接访问了。

将CakePHP作为网站子目录配置。

如果要把 CakePHP 作为一个网站的子目录访问,应该如何设置呢?

假设本机已经有网站 localhost ,我要把一个 CakePHP 项目配置到这个网站的 cakestrap 目录下,第一步就在 localhost 的根目录下建立一个软链接指向这个 CakePHP 项目。

1
$ ln -s /home/caiknife/source/cakestrap/app/webroot /usr/share/nginx/html/cakestrap

然后在 localhost 的配置文件里加入下面的代码:

1
2
3
4
5
6
location /cakestrap {
    # 目录浏览开启
    autoindex on;
    # 尝试将请求 $uri 解析为文件或者目录,如果都不是的话,重写到 $document_root/cakestrap/index.php 
    try_files $uri $uri/ /cakestrap/index.php?$uri&$args;
}

CakePHP 默认的 Apache 重写规则是:

1
2
3
4
5
6
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

和 Nginx 的 try_files $uri $uri/ /cakestrap/index.php?$uri&$args; 有异曲同工之妙, Apache 的重写规则很容易就能迁移到 Nginx 上。

Nginx 的基本配置就到这里,今后得研究研究它的反向代理、负载均衡和缓存功能。

Have a nice day!