Как установить nginx на Ubuntu\Debian + WordPress

В Ubuntu, как и в Debian благодаря всемогущему репозитарию установка множества программ, в том числе серьезных серверных пакетов сводиться к необходимости напечатать одну строчку типа sudo apt-get install …. и подождать пару минут и программа у вас на компьютере.

В принципе, с сервером nginx ситуация точно такая же, и к тому же мейнтейнеры ревниво следят, что-бы версия программы была всегда свежей.

Но, такой подход, многие считают не профессиональным, они же дураки, а другие просто любят компилировать из исходных кодов, в связи с тем, что делать им это приходиться на серверах.
Так как изначально, когда я столкнулся с nginx я устанавливал его из исходных кодов, то я опишу именно этот процесс.

По началу, эта статья задумывалась как небольшое руководство по установке сервера, но судя из новомодных тенденций, многие крупные сайты рунета, да и зарубежные, работают под управлением ngnix, и такой маленький сервер, так прекрастно справляется со своими обязанностями. По этому я решил более детально остановиться на изучении этого сервера и его возможностей.
Из-за практического отсутствия доументации на английском языке, я переведу и опубликую эту статью на английский язык. Как в прочем и многие другие.

Инструкция по установке из исходных кодов

Качаем сервер с сайта его создателя, последнюю версию:

cd ~/user
mkdir server
cd server 
wget http://sysoev.ru/nginx/nginx-0.7.59.tar.gz
cd ~/user
mkdir server
cd server 
wget http://sysoev.ru/nginx/nginx-0.7.59.tar.gz

Распаковываем архив:

tar xvf nginx-0.7.59
cd nginx-0.7.59
tar xvf nginx-0.7.59
cd nginx-0.7.59

Теперь, если у вас установлено все необходимое по дефолту, начинаем компиляцию, если нет, то ставим необходимое:

sudo aptitude install build-essential
sudo aptitude install build-essential
sudo aptitude install linux-headers-`uname -r`
sudo aptitude install linux-headers-`uname -r`

Выполняем configure:

./configure
./configure

Все пройдет нормально, но в конце мы увидим вот такую ошибку:

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.</path>
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.</path>

Плюс внимательно всмотритесь в поля помеченные * , скорее всего еще много чего не хватает.
Исправляем это командой:

sudo aptitude install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev
sudo aptitude install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

Это все необходимые нам библиотеки.
Делаем:

make clean
./configure --with-http_ssl_module
make 
make install
make clean
./configure --with-http_ssl_module
make 
make install

После этих нехитрых действий, сервер установлен в систему.

Если вас не устраивают стандартные пути, то при сборке вы можете указать удобные вам, включив соответсвующие ключи.

--prefix=< путь>
--prefix=< путь>

— задаёт каталог, в котором будут находиться файлы сервера. Этот же каталог будет использоваться для всех относительных путей, задаваемых ./configure (кроме путей к исходным текстам библиотек) и в конфигурационном файле nginx.conf. По умолчанию — каталог /usr/local/nginx.

--sbin-path=< путь>
--sbin-path=< путь>

— задаёт имя исполняемого файла nginx. Это имя используется только на стадии установки. По умолчанию файл называется prefix/sbin/nginx.

--conf-path=< путь>
--conf-path=< путь>

— задаёт имя конфигурационного файла nginx.conf. При желании nginx можно всегда запустить с другим конфигурационным файлом, указав его в параметре командной строки -c < файл>. По умолчанию файл называется prefix/conf/nginx.conf.

--pid-path=< путь>
--pid-path=< путь>

— задаёт имя файла nginx.pid, в котором будет хранится номер главного процесса. После установки имя файла можно всегда поменять в конфигурационном файле nginx.conf с помощью директивы pid. По умолчанию имя файла — prefix/logs/nginx.pid.

--error-log-path=< путь>
--error-log-path=< путь>

— задаёт имя основного файла ошибок, предупреждений и диагностики. После установки имя файла можно всегда поменять в конфигурационном файле nginx.conf с помощью директивы error_log. По умолчанию имя файла — prefix/logs/error.log.

--http-log-path=< путь>
--http-log-path=< путь>

— задаёт имя основного файла регистрации запросов http сервера. После установки имя файла можно всегда поменять в конфигурационном файле nginx.conf с помощью директивы access_log. По умолчанию имя файла — prefix/logs/access.log.

Как управлять сервером?

Запускается сервер командой:

sudo /usr/local/nginx/sbin/nginx
sudo /usr/local/nginx/sbin/nginx

Проверим его наличие в процессах:

ps -ef | grep nginx
root     14999     1  0 16:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody   15000 14999  0 16:44 ?        00:00:00 nginx: worker process      
booch    15084 29644  0 16:45 pts/0    00:00:00 grep nginx
ps -ef | grep nginx
root     14999     1  0 16:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody   15000 14999  0 16:44 ?        00:00:00 nginx: worker process      
booch    15084 29644  0 16:45 pts/0    00:00:00 grep nginx

Отлично. Теперь нужно открыть браузер и ввести уже знакомое http://localhost/
Если вы увидите приветствие, то все хорошо.

Завершить работу сервера можно, послав master-процессу сигнал QUIT:

kill -QUIT <pid></pid>
kill -QUIT <pid></pid>

Обновление сервера на лету.
Для обновления сервера нужно записать на место старого исполняемого файла новый. Затем нужно послать сигнал USR2 главному процессу — он переименует свой файл с номером процесса в файл с суффиксом .oldbin, например, /usr/local/nginx/logs/nginx.pid.oldbin, после чего запустит новый исполняемый файл, а тот в свою очередь — свои рабочие процессы:

kill -USR2 <pid></pid>
kill -USR2 <pid></pid>
 PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sb
33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sb
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
 PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sb
33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sb
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

Для применения новой конфигурации, в случае, если вы например обновили конфигурационный файл, необходимо послать серверу сигнал HUP:

kill -HUP <pid></pid>
kill -HUP <pid></pid>

QUIT – плавное завершение
TERM, INT – быстрое завершение
HUP – изменение конфигурации, обновление изменившейся временной зоны, запуск новых рабочих процессов с новой конфигурацией, плавное завершение старых рабочих процессов
USR1 – переоткрытие лог-файлов
USR2 – обновление исполняемого файла
WINCH – плавное завершение рабочих процессов

Где его искать?

Выше это уже было указано, но тем не менее и эта инфа не повредит. Так как в своей сборке я не менял стандартных путей, то расположение такое. Заметьте, что при установки с репозитариев, пути будут другие.

/usr/local/nginx/html – папка где лежит Web-страничка с приветствием, которую вы видели при тестировании ngnix, туда же можно положить и ваш сайт. Это будет не совсем правильно, если это ваш сервер.

/usr/local/nginx/conf/nginx.conf – тут лежит главный конфигурационный файл nginx.conf, в него же и следуют записывать все директивы.

Сервер

Если вы решили завести сервер на nginx, причем который смотрит в Сеть. И там крутиться ваш личный сайт или еще чего. То надо подумать о том, что-бы правильно организовать структуру вашего сайта или сайтов и настроить группы и их права доступа, квоты.

Начнем с создания группы www:

sudo groupadd www
sudo groupadd www

Создаем пользователя www:

sudo useradd www -g www
sudo useradd www -g www

Добавляем пользователя www в группу www:

sudo usermod -a -G www www
sudo usermod -a -G www www

Проверяем файл /etc/passwd/ на наличие одинаковых PID:

sudo cat /etc/passwd | grep 1001
motion:x:112:1001::/home/motion:/bin/false
www:x:1001:1002::/home/www:/bin/sh
sudo cat /etc/passwd | grep 1001
motion:x:112:1001::/home/motion:/bin/false
www:x:1001:1002::/home/www:/bin/sh

Измените PID на любой, понравившийся вам, так же не забудьте потом изменить PID в /etc/group
для группы www.

Создайте пароль для пользователя:

sudo passwd www
Введите новый пароль UNIX: 
Повторите новый пароль UNIX: 
passwd: пароль успешно обновлён
sudo passwd www
Введите новый пароль UNIX: 
Повторите новый пароль UNIX: 
passwd: пароль успешно обновлён

Теперь будем создавать структуру будущего сайта.
Скорее всего это так:

sudo mkdir /home/www/
sudo mkdir /home/www/
sudo mkdir -p /home/www/linuxspace.org/{log, private, public, backups, archives}
sudo mkdir -p /home/www/linuxspace.org/{log, private, public, backups, archives}

Получаем готовую платформу для будущего сайта.
Как вы видите, все папки пренадлежат пользователю www.
И для всех папок переназначены права 644, (rw+r+r) и для public 744 (rwx+r+r):

ls -la
итого 28
drw-r--r-- 2 www www 4096 2009-06-22 19:35 archives
drw-r--r-- 2 www www 4096 2009-06-22 19:36 log
-rw-r--r-- 1 www www    5 2009-06-22 19:39 nginx.pid
drw-r--r-- 2 www www 4096 2009-06-22 19:36 private
drwxr--r-- 5 www www 4096 2009-06-22 19:37 public
ls -la
итого 28
drw-r--r-- 2 www www 4096 2009-06-22 19:35 archives
drw-r--r-- 2 www www 4096 2009-06-22 19:36 log
-rw-r--r-- 1 www www    5 2009-06-22 19:39 nginx.pid
drw-r--r-- 2 www www 4096 2009-06-22 19:36 private
drwxr--r-- 5 www www 4096 2009-06-22 19:37 public

и теперь редактируем файл /usr/local/nginx/conf/nginx.conf
в котором можем указать все, что необходимо для работы вашего сервера.
Вот, что указал я:

#пользователь
user  www;
 
#колличество дочерних процессов
worker_processes  2;
 
#адрес pid-файла
pid     /home/www/linuxspace.org/nginx.pid;
 
#не забываем, что nginx работает по модели "неблокируемые сокеты или конечный автомат"
#но в UNIX непривилегированные процессы не могут использовать порты меньше 1024
events 
{
    worker_connections  1024;
}
 
http 
{
    include       mime.types;
    default_type  application/octet-stream;
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    sendfile        on;
    tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    #архивация и ее параметры
    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;
    gzip_comp_level 3;
    gzip_proxied any;
 
    #настройки виртуального хоста 
server {
        #слуашемый порт
        listen       *:90;
        
        #имя сервера
        server_name  localhost;
        
        #кодировка
        charset utf-8;
 
        #расположения основной (публичной) дирректории
    root /home/www/linuxspace.org/public;
 
        #LOGS (логи)
    #------------------------------------------------------------------
        access_log  /home/www/linuxspace.org/log/localhost.access.log;
        error_log /home/www/linuxspace.org/log/error.log;
        access_log  /home/www/linuxspace.org/log/access.log;
        #------------------------------------------------------------------
         
        #форматы index-файлов
        location / {
            root   /home/www/linuxspace.org/public;
            index  index.html index.htm index.php;
        }
 
        error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
       }
 
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;
 
    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_timeout  5m;
 
    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    #    ssl_prefer_server_ciphers   on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}
#пользователь
user  www;

#колличество дочерних процессов
worker_processes  2;

#адрес pid-файла
pid     /home/www/linuxspace.org/nginx.pid;

#не забываем, что nginx работает по модели "неблокируемые сокеты или конечный автомат"
#но в UNIX непривилегированные процессы не могут использовать порты меньше 1024
events 
{
    worker_connections  1024;
}

http 
{
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    #архивация и ее параметры
    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;
    gzip_comp_level 3;
    gzip_proxied any;

    #настройки виртуального хоста 
server {
        #слуашемый порт
        listen       *:90;
        
        #имя сервера
        server_name  localhost;
        
        #кодировка
        charset utf-8;

        #расположения основной (публичной) дирректории
	root /home/www/linuxspace.org/public;

        #LOGS (логи)
	#------------------------------------------------------------------
        access_log  /home/www/linuxspace.org/log/localhost.access.log;
        error_log /home/www/linuxspace.org/log/error.log;
        access_log  /home/www/linuxspace.org/log/access.log;
        #------------------------------------------------------------------
         
        #форматы index-файлов
        location / {
            root   /home/www/linuxspace.org/public;
            index  index.html index.htm index.php;
        }

        error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
       }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

Не советую выдирать из файла примеры, в конечном счете они могут вам пригодиться. Или сделайте backup файла, на всякий случай.

Сам файлик может валяться где угодно. Но если директория отличная от дефолтной, при запуске nginx это необходимо учесть с помощью ключа -c
Например:

/usr/local/nginx/sbin/nginx -c /home/user/nginx.conf
/usr/local/nginx/sbin/nginx -c /home/user/nginx.conf

Давайте посмотрим на работу сервера.
Запустите его и посмотрите на него в списке процессов. Это должно выглядеть так:

ps -ef | grep nginx
root      7146     1  0 02:19 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
www     7147  7146  0 02:19 ?      00:00:00 nginx: worker process      
www     7148  7146  0 02:19 ?      00:00:00 nginx: worker process
ps -ef | grep nginx
root      7146     1  0 02:19 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
www     7147  7146  0 02:19 ?      00:00:00 nginx: worker process      
www     7148  7146  0 02:19 ?      00:00:00 nginx: worker process

Все отлично! Главный процесс запущен от рута, остальные два процесса, как мы и указали в файле, пренадлежат пользователю www и являются не привегилированными.

Теперь, когда мы имеем некое предстовление о том, как установить сервер, найти все его конфигурационные и исполняемые файлы, а так же как его запустить и остановить, неплохо было бы задаться вопросом типа: “Эээ ХТМЛ это конечно круто, но как на счет че нить по серьезней типа связки с PHP и популярными CMS ??

Установка WordPress на Nginx

Давайте рассмотрим реализацию сервера и принцип его работы. В таком случае, нам станет понятно, как правильно организовать свой сервер.

nginx работает по схеме неблокируемых сокетов или так называемый конечный автомат, что это означает, то что, сервер на каждой итерации бесконечного цикла выбирает из всех сокетов тот, который готов для работы с данными (отправка\прием) с помощью вызова select(). После того, как сокет выбран, сервер отправляет на него данные или читает их, но не ждет подтверждения, а переходит в начальное состояние ожидания события на другом сокете или же обрабатывает следующий, в котором событие произошло во время обработки предыдущего. Таким образом nginx затрачивает на порядок меньше ресурсов ОС, таких как память и процессорное время, но есть одно но, nginx не может генерировать динамический контент внутри себя, т.к. это приведет к блокировкам внутри него. Решение есть и давно: nginx может проксировать запросы (генерирование контента) на любой другой Web-server: Apache или FastCGI.

Сейчас большинство крупных сайтов используют связку nginx + Apache, называется она фронтэнд-бэкенд (frontend & backend)

Как работает такая связка?
Пусть nginx будет в качестве основного сервера и Apache в качестве сервера для генерации динамического контента:

Nginx принимает соединение от клиента и читает от него весь запрос. После того, как nginx прочитал весь ответ, он открывает соединение к Apache. Последний выполняет свою работу (генерирует динамический контент), после чего отдает свой ответ nginx, который его буферизует в памяти или временном файле. Тем временем, Apache освобождает ресурсы. Далее nginx медленно отдает контент клиенту, тратя при этом на порядки меньше ресурсов, чем Apache.

how-to как реализовать такую связку, будет опубликованно в следующих статьях.

Как поднять что-нибудь солидное? Например wordpress.
Для начала, необходимо установить в систему все необходимые компоненты.

Устанавливаем PHP

sudo aptitude install php5-common php5-dev php5-mysql php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-cgi php5-mcrypt php5-curl php5-gd php5-mhash php5-pspell php5-snmp php5-sqlite libmagick9-dev php5-client
sudo aptitude install php5-common php5-dev php5-mysql php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-cgi php5-mcrypt php5-curl php5-gd php5-mhash php5-pspell php5-snmp php5-sqlite libmagick9-dev php5-client

В данном случае, я ограничелся пачкой пакетов и установленным с репов PHP с уже говотовой поддержкой FastCGI, а не ставил из исходников. Что тоже хороший вариант.

Устанавливаем MySQL

sudo aptitude install mysql-server mysql-client libmysqlclient15-dev
sudo aptitude install mysql-server mysql-client libmysqlclient15-dev

Устанавливаем FastCGI

Для этого нам необходимо выдрать его из другого Web-сервера lighttpd, обратите внимание на версию, так как если вы скачаете последнюю версию сервера, сейчас это 1.4.23, затем соберете его, сделаете make, а потом попробуете перебросить spawn-cgi в /usr/bin/ у вас ничего не получиться, почему, ответ написан на сайте создателей, и выглядит так:

Important changes
* Fix workaround for incorrect path info/scriptname if fastcgi prefix is ”/” (fixes #729)
* Finally removed spawn-fcgi
* Fix bug with FastCGI request id overflow under high load; just use always id 1 as we don’t use multiplexing. (thx jgray)
* Workaround broken operating systems: check for trailing ’/’ in filenames (fixes #1989)

По этому, качаем версию 1.4.19 или раньше.

wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.bz2
wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.bz2

Распаковываем:

tar jxvf lighttpd-1.4.19.tar.bz2
tar jxvf lighttpd-1.4.19.tar.bz2
cd lighttpd-1.4.19
cd lighttpd-1.4.19
sudo ./configure
sudo ./configure

Тут при сборке, программа сообщит вам об ошибке:

configure: error: pcre-config not found, install the pcre-devel package or build with --without-pcre
configure: error: pcre-config not found, install the pcre-devel package or build with --without-pcre

Вывод, надо доставить пару пакетов:

sudo aptitude install libpcre3-dev libbz2-dev
sudo aptitude install libpcre3-dev libbz2-dev
sudo ./configure
sudo ./configure

Теперь все должно пройти без ошибок:

sudo make
sudo make

Перебрасываем spawn-cgi в /usr/bin/:

sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi
sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi

Создаем скрипт запуска:

sudo nano /usr/bin/php-fastcgi
sudo nano /usr/bin/php-fastcgi

Пишем в него одну строчку:

#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -f /usr/bin/php5-cgi
#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -f /usr/bin/php5-cgi

Что означает эта строчка?
/usr/bin/spawn-fcgi -a 127.0.0.1 – команда запуска
-p 9000 – на порт 9000
-u www -g www – юзер www, группа www
-f /usr/bin/php5-cgi – путь к вашему пакету php5-cgi

если он вам по каким-то причинам не известен, поможет команда which. При установке из репов, путь именно такой.

Создаем скрипт запуска FastCGI:

sudo nano /etc/init.d/init-fastcgi
sudo nano /etc/init.d/init-fastcgi

В него вставляем следующее

#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall -9 php5-cgi
RETVAL=$?
;;
restart)
killall -9 php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall -9 php5-cgi
RETVAL=$?
;;
restart)
killall -9 php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL

Делаем скрипты исполняемыми:

sudo chmod +x /usr/bin/php-fastcgi
sudo chmod +x /usr/bin/php-fastcgi
sudo chmod +x /etc/init.d/init-fastcgi
sudo chmod +x /etc/init.d/init-fastcgi

Запускаем скрипт:

/etc/init.d/init-fastcgi start
/etc/init.d/init-fastcgi start

spawn-fcgi.c.197: child spawned successfully: PID: 32477 – подтверждение успешного запуска.

Смотрим таблицу процессов:

ps -ef | grep cgi
www      32573     1  2 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32575 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32576 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32577 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32578 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32579 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
ps -ef | grep cgi
www      32573     1  2 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32575 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32576 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32577 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32578 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi
www      32579 32573  0 04:04 ?        00:00:00 /usr/bin/php5-cgi

А для того, чтобы всё работало после перезагрузки набираем:

sudo update-rc.d init-fastcgi defaults
sudo update-rc.d init-fastcgi defaults

Вам нужно быть уверенным, что запущен сервер nginx и PHP в режиме CGI
Теперь что-бы nginx корректно работал с PHP необходимо заново отредактировать файл /usr/local/nginx/conf/nginx.conf настроив nginx на работу с PHP а не html.

Вот как он должен выглядеть в минимальной своей конфигурации:

user  www;
worker_processes  2;
 
pid     /home/www/linuxspace.org/nginx.pid;
 
events 
{
    worker_connections  1024;
}
 
http 
{
    include       mime.types;
    default_type  application/octet-stream;
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    sendfile        on;
    tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;
    gzip_comp_level 3;
    gzip_proxied any;
 
 
server {
        listen       80;
        server_name  localhost;
 
        charset utf-8;
    root /home/www/linuxspace.org/public;
 
        #LOGS
    #------------------------------------------------------------------
        access_log  /home/www/linuxspace.org/log/localhost.access.log;
        error_log /home/www/linuxspace.org/log/error.log;
        access_log  /home/www/linuxspace.org/log/access.log;
        #------------------------------------------------------------------
 
        location / {
            root   /home/www/linuxspace.org/public;
            index  index.html index.htm index.php;
        }
 
        error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        # location ~\.php$ {
        #   proxy_pass   http://127.0.0.1;
        #                   }
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/www/linuxspace.org/public/$fastcgi_script_name;
            include        fastcgi_params;
        }
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
       }
 
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;
 
    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_timeout  5m;
 
    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    #    ssl_prefer_server_ciphers   on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
}
user  www;
worker_processes  2;

pid     /home/www/linuxspace.org/nginx.pid;

events 
{
    worker_connections  1024;
}

http 
{
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;
    gzip_comp_level 3;
    gzip_proxied any;


server {
        listen       80;
        server_name  localhost;

        charset utf-8;
	root /home/www/linuxspace.org/public;

        #LOGS
	#------------------------------------------------------------------
        access_log  /home/www/linuxspace.org/log/localhost.access.log;
        error_log /home/www/linuxspace.org/log/error.log;
        access_log  /home/www/linuxspace.org/log/access.log;
        #------------------------------------------------------------------

        location / {
            root   /home/www/linuxspace.org/public;
            index  index.html index.htm index.php;
        }

        error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        # location ~\.php$ {
        #   proxy_pass   http://127.0.0.1;
        #                   }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/www/linuxspace.org/public/$fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
       }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Далее закидываем wordpress в нашу корневую папку:

wget http://ru.wordpress.org/wordpress-2.8-ru_RU.zip
wget http://ru.wordpress.org/wordpress-2.8-ru_RU.zip
unzip wordpress-2.8-ru_RU.zip
unzip wordpress-2.8-ru_RU.zip
cd wordpress
cd wordpress
mv * /home/www/linuxspace.org/public/
mv * /home/www/linuxspace.org/public/

И вводим в броузере http://localhost/

Вы должны будете увидеть окно приветсвия WordPress.

Настройка MySQL. Создание базы данных.

Теперь, все что вам осталось, это создать базу данных для блога.
Помним, что MySQL уже установленна в систему.
Для начала необходимо запустить сервер:

sudo /etc/init.d/mysql start
sudo /etc/init.d/mysql start

Далее сменить рутовский пароль и провести кое какую настройку.
Выполняем ниже написанную команду, внимательно читаем все опции:

sudo /usr/bin/mysql_secure_installation
sudo /usr/bin/mysql_secure_installation

Далее выполняем устновку административных таблиц:

sudo /usr/bin/mysql_install_db
sudo /usr/bin/mysql_install_db

Теперь пришло время создавать таблицу для блога.
Выполняем вход в MySQL:

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 68
Server version: 5.0.75-0ubuntu10.2 (Ubuntu)
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql> 
mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 68
Server version: 5.0.75-0ubuntu10.2 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> 

Eсли вы увидели что-то похожее, то вход выполнен.
Далее создаем таблицу:

mysql> CREATE DATABASE `wordpress` CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE DATABASE `wordpress` CHARACTER SET utf8 COLLATE utf8_general_ci;

Синтаксис оператора CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset] [COLLATE collation];

db_name – Имя, которое будет присвоено создаваемой базе данных.

IF NOT EXISTS – Если не указать этот параметр, то при попытке создания базы данных с уже существующим именем, возникнет ошибка выполнения команды.

CHARACTER SET, COLLATE – Используется для задания стандартной кодировки таблицы и порядка сортировки.

Если при создании таблицы эти параметры не указываются, то кодировка и порядок сортировки вновь создаваемой таблицы берутся из значений, указанных для всей базы данных. Если задан параметр CHARACTER SET, но не задан параметр COLLATE, то используется стандартный порядок сортировки. Если задан параметр COLLATE, но не задан CHARACTER SET, то кодировку определяет первая часть имени порядка сортировки в COLLATE.

Для того, чтобы посмотреть настройки уже существующей базы данных необходимо выполнить оператор SHOW CREATE DATABASE

mysql> SHOW CREATE DATABASE `wordpress`;
mysql> SHOW CREATE DATABASE `wordpress`;

Вот инфа о базе, которую только-что создал я:

mysql> SHOW CREATE DATABASE `wordpress`;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| my_db    | CREATE DATABASE `my_db` /*!40100 DEFAULT CHARACTER SET utf8 */ | 
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SHOW CREATE DATABASE `wordpress`;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| my_db    | CREATE DATABASE `my_db` /*!40100 DEFAULT CHARACTER SET utf8 */ | 
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

Завершите работу с mysql выполнив:

mysql>QUIT
mysql>QUIT

Теперь, осталось в поле “имя БД” в процессе установки wordpress указать имя созданной вами базы и в полях логин\пароль указать имя пользователя и пароль рута для MySQL.

За сим все! Статья и так получилась огромной :-) Наверное и половина не дочитает ее до конца. :-) Надеюсь кому-нибудь будет полезно.