Pull to refresh

Настройка php-cgi в связке с nginx на основе sockets

Reading time3 min
Views3.4K
Всем привет.

Под капотом приведен пример того, как можно настроить php-cgi на основе unix:sockets.
Пример рассчитан на дистрибутивы Ubuntu и Debian.


Введение


Лично мне этот способ очень нравится, по этому решил поделится с общественностью, которая с ним не знакома.

Ну во-первых, потому что он очень простой.
Во-вторых, гибкий благодаря сокетам
В-третьих, быстрый.
Ну и другие вытекающие возможности, в том числе и с правами)

Установка


Дальше не чего особенного, стандартные действия:
nginx

sudo apt-get update
sudo apt-get install nginx

php

sudo apt-get install php5-cgi

Связываем php и nginx


Для связывания, достаточно воспользоваться скриптом одного хорошего человека Till Klampaeckel.
И так, в дириктории /etc/init.d/ создаем файл php-fcgid
записываем в него следующее:
#!/bin/sh
#
# Author: Till Klampaeckel <till@php.net>
# Credits
#  * original script: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2007-09/msg00468.html
#  * improved: http://till.klampaeckel.de/blog/archives/30-PHP-performance-III-Running-nginx.html
#  * all linux start script fu inspired by CouchDB's start script (by Noah Slater)

SCRIPT_OK=0
SCRIPT_ERROR=1

DESCRIPTION="php-fcgi super-duper-control thing"
NAME=php-fgcid
SCRIPT_NAME=$(basename $0)

WWW_GROUP=www-data
PHP_CGI=/usr/bin/php-cgi

phpfcgid_users="user1 user2"
phpfcgid_children="2"
phpfcgid_tmpdir="/tmp"
phpfcgid_requests="100"

log_daemon_msg () {
    echo $@
}

log_end_msg () {
    # Dummy function to be replaced by LSB library.

    if test "$1" != "0"; then
        echo "Error with $DESCRIPTION: $NAME"
    fi
    return $1
}

phpfcgid_start() {
    echo "Starting $NAME with $phpfcgid_children children (req: $phpfcgid_requests)."

    export PHP_FCGI_CHILDREN=$phpfcgid_children
    export PHP_FCGI_MAX_REQUESTS=$phpfcgid_requests

    for user in ${phpfcgid_users}; do
        socketdir="${phpfcgid_tmpdir}/.fastcgi.${user}"
        mkdir -p ${socketdir}
        chown ${user}:${WWW_GROUP} ${socketdir}
        chmod 0750 ${socketdir}
        su -m ${user} -c "${PHP_CGI} -b ${socketdir}/socket&"
    done
}

phpfcgid_stop() {
    echo "Stopping $NAME."
    pids=`pgrep php-cgi`
    pkill php-cgi
}

phpfcgid_status() {
    log_daemon_msg "To be implemented: status"
    log_end_msg $SCRIPT_ERROR
}


parse_script_option_list () {

    case "$1" in
        start)
            log_daemon_msg "Starting $DESCRIPTION" $NAME
            if phpfcgid_start; then
                log_end_msg $SCRIPT_OK
            else
                log_end_msg $SCRIPT_ERROR
            fi
            ;;
        stop)
            log_daemon_msg "Stopping $DESCRIPTION" $NAME
            if phpfcgid_stop; then
                log_end_msg $SCRIPT_OK
            else
                log_end_msg $SCRIPT_ERROR
            fi
            ;;
        restart|force-reload)
            log_daemon_msg "Restarting $DESCRIPTION" $NAME
            if phpfcgid_stop; then
                if phpfcgid_start; then
                    log_end_msg $SCRIPT_OK
                else
                    log_end_msg $SCRIPT_ERROR
                fi
            else
                log_end_msg $SCRIPT_ERROR
            fi
            ;;
        status)
            phpfcgid_status
            ;;
        *)
            cat << EOF >&2
Usage: $SCRIPT_NAME {start|stop|restart|force-reload|status}
EOF
            exit $SCRIPT_ERROR
            ;;
    esac
}

parse_script_option_list $@


Настраиваем


В настройках nginx настраиваем соответствие пользователя с fastcgi_pass.
Пример конфига:
server {
	listen   80;
	server_name  myhost.com;

	access_log  /var/log/nginx/myhost.com.access.log;

	location / {
		autoindex  on;
		root   /var/www/myhost.com;
		index  index.php index.html index.htm;
	}

	location ~ .php {
		include fastcgi_params;

		fastcgi_pass  unix:/tmp/.fastcgi.www-data/socket;
		fastcgi_index index.php;

		fastcgi_param SCRIPT_FILENAME /var/www/myhost.com/$fastcgi_script_name;
	}
}


Первый запуск скрипта:
sudo bash /etc/init.d/php-fcgid

Перезапуск nginx, после изменений, думаю занаете как.

Собственно на этом все.
Enjoy!
Tags:
Hubs:
Total votes 17: ↑10 and ↓7+3
Comments14

Articles