Difference between #1 and #2 of
Using Yii with Nginx and PHP-FPM

Revision #2 has been created by intel352 on Jun 16, 2011, 3:45:18 PM with the memo:

Updated with a current complete config, nginx + php-fpm
« previous (#1) next (#3) »

Changes

Title unchanged

Using Yii with Nginx

Category unchanged

How-tos

Yii version unchanged

Tags changed

nginx, php-fpm, php5-fpm, rewrite, ubuntu

Content changed

The full configuration is here, let's explain it later.
 
 
 
```php 
server {
 
    listen       80;
 
    server_name  example.com www.example.com;
 
 
    charset utf-8;
 
 
    access_log  logs/example.access.log  main;
 
 
    location / {
 
        root   /home/yeegt/yiigt;
 
        index  index.php;
 
        try_files $uri $uri/ /index.php?$args;
 
    }
 
 
    location ~ ^/protected/ {
 
        deny  all;
 
    }
 
 
    location ~*.(js|jpg|jpeg|gif|png|ico)$ {
 
        root /home/example/yii-app;
 
        expires 356d;
 
        add_header Cache-Control public;
 
    }
 
 
    location ~ \.php$ {
 
        root           /home/example/yii-app;
 
        fastcgi_pass   127.0.0.1:9010;
 
        fastcgi_index  index.php;
 
        fastcgi_param  SCRIPT_FILENAME  /home/example/yii-app$fastcgi_script_name;
 
        include        fastcgi_params;
 
 
        set $path_info $request_uri;
 
 
        if ($request_uri ~ "^(.*)(\?.*)$") {
 
            set $path_info $1;
 
        }
 
        fastcgi_param PATH_INFO $path_info;
 
    }
 
}
 
```
 
 
 
is config is built on an Ubuntu 11.04 server.
 
Software is nginx, php-fpm (php5-fpm).
 
For performance, it's recommended to run php-fpm in SOCKET mode, instead of accessing via IP:PORT. That is the method shown below.
 
 
~~~
 
# Implement upstream connection to PHP-FPM
 
# "phpfpm" here is a name for this upstream connection, which you can customize
 
# I create a custom upstream connection per vhost, to better segregate PHP processes by vhost
 
# To do the same, you need a unique upstream name, and a unique filename for your php5-fpm.sock file
 
upstream phpfpm {
 
    server unix:/var/run/php5-fpm.sock;
 
}
 
 
server {
 
    # Listening on port 80 without an IP address is only recommended if you are not running multiple v-hosts
 
    #listen       80;
 
    # Bind to the public IP bound to your domain
 
    listen 123.456.789.012:80;
 
    # Specify this vhost's domain name
 
    server_name mydomainname.com;
 
    root /var/www/mydomainname.com/public;
 
    index index.php index.html index.htm;
 
 
    # Specify log locations for current site
 
    access_log /var/www/mydomainname.com/log/access.log;
 
    error_log /var/www/mydomainname.com/log/error.log warn;
 
 
    # Typically I create a restrictions.conf file that I then include across all of my vhosts
 
    #include conf.d/restrictions.conf;
 
    # I've included the content of my restrictions.conf in-line for this example
 
 
    # BEGIN restrictions.conf
 
    # Disable logging for favicon
 
    location = /favicon.ico {
 
        log_not_found off;
 
        access_log off;
 
    }
 
 
    # Disable logging for robots.txt
 
    location = /robots.txt {
 
        allow all;
 
        log_not_found off;
 
        access_log off;
 
    }
 
 
    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
 
    location ~ /\. {
 
        deny all;
 
        access_log off;
 
        log_not_found off;
 
    }
 
    # END restrictions.conf
 
 
    # Typically I create a yiiframework.conf file that I then include across all of my yii vhosts
 
    #include conf.d/yiiframework.conf;
 
    # I've included the content of my yiiframework.conf in-line for this example
 
 
    # BEGIN yiiframework.conf
 
    # Block access to protected, framework, and nbproject (artifact from Netbeans)
 
    location ~ /(protected|framework|nbproject) {
 
        deny all;
 
        access_log off;
 
        log_not_found off;
 
    }
 
 
    # Block access to theme-folder views directories
 
    location ~ /themes/\w+/views {
 
        deny all;
 
        access_log off;
 
        log_not_found off;
 
    }
 
 
    # Attempt the uri, uri+/, then fall back to yii's index.php with args included
 
    # Note: old examples use IF statements, which nginx considers evil, this approach is more widely supported
 
    location / {
 
        try_files $uri $uri/ /index.php?$args;
 
    }
 
    # END yiiframework.conf
 
 
    # Tell browser to cache image files for 24 hours, do not log missing images
 
    # I typically keep this after the yii rules, so that there is no conflict with content served by Yii
 
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
 
        expires 24h;
 
        log_not_found off;
 
    }
 
 
    # Block for processing PHP files
 
    # Specifically matches URIs ending in .php
 
    location ~ \.php$ {
 
        try_files $uri =404;
 
 
        # Fix for server variables that behave differently under nginx/php-fpm than typically expected
 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
 
        # Include the standard fastcgi_params file included with nginx
 
        include fastcgi_params;
 
        fastcgi_index index.php;
 
        # Override the SCRIPT_FILENAME variable set by fastcgi_params
 
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
 
        # Pass to upstream PHP-FPM; This must match whatever you name your upstream connection
 
        fastcgi_pass phpfpm;
 
    }
 
}
 
~~~
 
 
PHP-FPM config is below, have not had to optimize settings yet as they work fine for my usage.
 
Replace any instance of USER,GROUP with the user and group you want to run the website under.
 
Typical is www-data in Ubuntu.
 
~~~
 
[phpfpm]
 
 
listen = /var/run/php5-fpm.sock
 
listen.owner = USER
 
listen.group = GROUP
 
listen.mode = 0666
 
;listen.backlog = 4096
 
user = USER
 
group = GROUP
 
pm = dynamic
 
pm.max_children = 50
 
pm.start_servers = 20
 
pm.min_spare_servers = 5
 
pm.max_spare_servers = 35
 
pm.status_path = /fpm-status
 
ping.path = /fpm-ping
 
ping.response = pong
 
chdir = /var/www/mydomainname.com
 
catch_workers_output = yes
 
 
request_terminate_timeout = 180s
 
 
; The following php_admin_* settings below, override php.ini settings
 
php_admin_value[error_log] = /var/www/mydomainname.com/log/fpm-php-error.log
 
 
; The following settings are specifically used on development sites
 
; Should review/disable for production site
 
php_admin_value[max_execution_time] = 180
 
php_admin_flag[log_errors] = on
 
php_admin_value[memory_limit] = 320m
 
php_admin_value[error_reporting] = E_ALL
 
php_admin_flag[display_errors] = on
 
php_admin_flag[display_startup_errors] = on
 
~~~
18 0
20 followers
Viewed: 108 622 times
Version: 1.1
Category: How-tos
Written by: Leric
Last updated by: grigori
Created on: Feb 28, 2011
Last updated: 12 years ago
Update Article

Revisions

View all history