DataLife Engine > Статьи > Высокопроизводительный веб-сервер на базе Nginx

Высокопроизводительный веб-сервер на базе Nginx


30-03-2012. Разместил: synergix Не так давно потребовалось мне настроить высокопроизводительный веб-сервер при весьма скромных ресурсах (VDS). Хостер предоставлял на выбор несколько операционных систем, среди которых значилась и FreeBSD, чем я не преминул воспользоваться. Учитывая скудость ресурсов, было решено ставить джентльменский набор обеспечения: nginx, php-fm, mysql, memcache, eaccelerator.

Что собственно хотелось достичь:
1. Малое потребление ресурсов.
2. Высокую скорость отклика.
3. Стабильность под большой нагрузкой.

Определившись с ПО, начинаем установку.
Для начала, традиционно обновляем коллекцию портов, скопировав файлик /usr/share/exampeles/cvsup/ports-supfile в /etc и поправив в нем строчку default host на предпочтительный cvs-сервер:

csup -g -L 2 /etc/ports-supfile


Закончив синхронизацию, ставим Nginx:
cd /usr/ports/www/nginx
make install clean


После завершения установки Nginx ставим PHP:
cd /usr/ports/lang/php52
make install clean

В окне выбираем
  • FPM и жмем ОК.

    Все дополнения для PHP у нас собраны в мета-порте php5-extensions:
    cd /usr/ports/lang/php52-extension
    make install clean


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

    Ставим MySQL:
    cd /usr/ports/database/mysql55-server
    make install clean


    Не забываем после установки задать пароль root для MySQL:
    mysql -u root mysql
    >SET PASSWORD FOR root@localhost=PASSWORD('new_password');


    Ставим memcache:
    cd /usr/ports/databases/pecl-memcache
    make install clean


    В процессе установки в файл /usr/local/etc/php/extensions.ini автоматически добавится строчка
    extension=memcache.so


    И eAccelerator:
    cd /usr/ports/www/eaccelerator
    make install clean


    Настраиваем его в соответствии с этой статьей.

    Ну и напоследок phpMyAdmin:
    cd /usr/local/databases/phpmyadmin
    make install clean


    Закончив установку всего необходимого, приступаем к настройке.

    Начнем с правки основного конфига Nginx:
    user www;
    worker_processes 1;
    error_log /var/log/nginx/error.log;
    
    events	{
    	worker_connections 1024;
            use kqueue;
    
    }
    
    https	{
    	include mime.types;
    	index index.html index.htm index.php;
    	default_type application/octet-stream;
    	sendfile on;
    	keepalive_timeout 65;
    	gzip on;
    	charset utf-8;
    	source_charset utf-8;
    	log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    		'$status $body_bytes_sent "$https_referer" '
    		'"$https_user_agent" "$https_x_forwarded_for"';
    
    	server {
    		listen 80;
    		server_name _; #Задано таким образом для обработки любого домена
    		server_name_in_redirect off;
    		access_log /var/log/nginx/access.log main;
    		client_max_body_size 10M;
    		root /web/site.my;
    		
                    #Подключаем собственно php-fm через unix-сокеты
                    location ~ .php$ {
    			fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    			fastcgi_index  index.php;
    			fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    			include        fastcgi_params;
    		}
    		
                    location ~ /.ht {
    			deny all;
    		}
    
                 }
              #Поскольку сайтов планируем больше одного, сделаем раздельные конфиги. 
              include /usr/local/etc/nginx/sites/*.conf;
            }
    


    Не забываем создать папочку для логов nginx:
    cd /var/log
    mkdir nginx
    


    Заодно приложу пример для еще одного сайта.
    Создаем папку для пользовательских конфигов и собственно конфиг:
    mkdir /usr/local/etc/nginx/sites/
    touch /usr/local/etc/nginx/sites/site2.my.conf
    ee site2.my.conf
    


    И собственно конфиг:
    server {
    		listen 80;
    		server_name site2.my www.site2.my;
    		access_log /var/log/nginx/site2.my-access.log main;
                    error_log /var/log/nginx/site2.my-error.log main;
    		root /web/site2.my;
    		
                    #Подключаем собственно php-fm через unix-сокеты
                    location ~ .php$ {
    			fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    			fastcgi_index  index.php;
    			fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    			include        fastcgi_params;
    		}
    		
                    location ~ /.ht {
    			deny all;
    		}
    
                 }



    Правим конфиг /usr/local/etc/php-fpm.conf для работы php-fm через unix-сокеты для получения максимальной производительности. Ищем строчку 127.0.0.1:9000 и меняем на

    <value name "listen_address">/var/run/php-fpm/php-fpm.sock</value>



    Добавляем следующие строчки в /etc/rc.conf для запуска:
    nginx_enable="YES"
    php_fpm_enable="YES"
    mysql_enable="YES"
    


    И запускаем:
    service nginx start
    service php-fpm start
    service mysql-server start


    В домашнюю директорию (а у нас она /web/site.my) кладем файлик index.php, содержимое которого
    <?php
    phpinfo();
    ?>


    И открываем его в браузере по адресу http://site.my/
    Полюбовавшись на информацию касательно установленных компонентов, перегружаем VDS.
    Убедившись что все сервисы корректно запустились - начинаем заливать контент на VDS.

    P.S. Конечно же, не забываем настроить файерволл.
    Вернуться назад