Установка Apache + Mysql + Nginx

Apache + Nginx



Установка Apache


Действия производятся на Ubuntu 12.04 server

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




Если система ставится с нуля, то при установке указываем LAMP (Linux Apache MySQL PHP)





Если ОС уже есть, то одной командой обновляем систему, установливаем Apache, Mysql и phpMyAdmin:

sudo apt-get -y update && sudo apt-get -y upgrade && sudo apt-get -y install lamp-server^ && sudo apt-get -y install phpmyadmin

Ключ -y отвечает согласием на установку.

Отдельно MySQL:


sudo apt-get install mysql-server mysql-client php5-mysql phpmyadmin


В процессе нужно будет придумать пароль (запишите на бумажку) администратора Mysql:
Пароль не должен совпадать с паролем администратора компьютера.



Выбрать сервер для phpMyAdmin:



На этот вопрос отвечаем Нет:





После этих процедур перезапускаем Apache, чтоб посмотреть нет ли предупреждений или ошибок:

sudo service apache2 restart

Может появиться вот такое сообщение:


Исправим это...

Редактируем файл /etc/apache2/httpd.conf:

sudo nano /etc/apache2/httpd.conf

Добавляем строку:

ServerName localhost



Сохраняем…
подсказка nano

Сохранить______Выйти

И перезапускаем Apache:

sudo service apache2 restart



Теперь всё чистенько...


Идём в браузер — ip-сервера и видим:


Сервер работает...



Заходим в phpMyAdminip-сервера/phpmyadmin



Вводим логин root и пароль, который придумывали раннее и нажимаем ОК



Apache, Mysql и php работают...


В целях безопасности, внесём небольшие поправки в файл /etc/apache2/conf.d/phpmyadmin.conf

sudo nano /etc/apache2/conf.d/phpmyadmin.conf




Изменим строчку:

Alias /phpmyadmin /usr/share/phpmyadmin

На что-нибудь нелепое:

Alias /xrennaideshmyphpmyadmin /usr/share/phpmyadmin


И в блок <Directory /usr/share/phpmyadmin> добавим разрешение на доступ только с Вашего ip.


Order Deny,Allow
Deny from all
Allow from 132.28.31.134 # Ваш ip или localhost 


Вот так:

<Directory /usr/share/phpmyadmin>
        Options FollowSymLinks
        DirectoryIndex index.php

        <IfModule mod_php5.c>
                AddType application/x-httpd-php .php

                php_flag magic_quotes_gpc Off
                php_flag track_vars On
                php_flag register_globals Off
                php_admin_flag allow_url_fopen Off
                php_value include_path .
                php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
                php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/
        </IfModule>

Order Deny,Allow
Deny from all
Allow from 132.28.31.134 # Ваш ip

</Directory>


Сохраняем и рестартуем Apache:

sudo service apache2 restart

Теперь адрес phpMyAdmin знаете только Вы, а заходить в него будете так:

ip-сервера/xrennaideshmyphpmyadmin



Продолжим настройку Apache

Сейчас, если взломщик запросит у Вашего сервера несуществующую страницу, то узнает имя ОС и версию сервера:


Это нужно запретить...


Редактируем файл /etc/apache2/conf.d/security

sudo nano /etc/apache2/conf.d/security

Находим строчки:

ServerTokens OS

и
ServerSignature On

Меняем их на:

ServerTokens Prod

и
ServerSignature Off


Сохраняем и рестартуем Apache:

sudo service apache2 restart


Теперь выглядит так:


Затруднили жизнь хулиганам...



Создаём файл .htaccess (если существует, то пропускаем этот пункт) в дефолтной пакпке /var/www/:

sudo touch /var/www/.htaccess


Редактируем:

sudo nano /var/www/.htaccess

Вставляем строки:


AddDefaultCharset UTF-8 # страницы будут отдаваться в UTF-8 кодировке
Options -Indexes        # запрещаем просмотр папок сервера
RewriteEngine On        # редирект

Сохраняем…


Чтоб .htaccess стал доступным, редактируем файл /etc/apache2/sites-available/default

sudo nano /etc/apache2/sites-available/default

В блоке:


        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

Правим строчку:

AllowOverride None

на
AllowOverride All


Сохраняем и рестартуем Apache:

sudo service apache2 restart



Apache готов к работе.

Закидываем свой сайт в папку /var/www/
Владельцем папки со всем содержимым, делаем пользователя www-data

sudo chown -R www-data:www-data /var/www


Подключим модуль rewrite

sudo a2enmod rewrite


Рестартуем Apache:

sudo service apache2 restart


И можем пользоваться...


Nginx


Nginx — простой, быстрый и надёжный сервер. Применяется чаще всего для статических веб-сайтов и как прокси-сервер перед динамическими сайтами.

Иными словами, Nginx ставится «перед» Apache и занимается отдачей статического контента (картинки, архивы, css, pdf и т.д.). Apache же занимается обработкой php-файлов и прочей «динамики».

Тем самым увеличивается производительность сервера.


Установка

Прежде всего нужно перекинуть Apache на другой порт (8080) и сделать его локальным.
На стандартном порту (80) будет висеть Nginx.

Таким образом Apache не будет виден извне, а принимать запросы будет Nginx.


Редактируем файл /etc/apache2/ports.conf

sudo nano /etc/apache2/ports.conf

Меняем строчки:


NameVirtualHost *:80
Listen 80

на

NameVirtualHost localhost:8080
Listen localhost:8080

Сохраняем...

Редактируем файл /etc/apache2/sites-available/default

sudo nano /etc/apache2/sites-available/default

Меняем строчку:

<VirtualHost *:80>

на
<VirtualHost localhost:8080>


Сохраняем и рестартуем Apache:

sudo service apache2 restart



Теперь сайт виден только на localhost:8080


Устанавливаем Nginx:

sudo apt-get install nginx


Дожидаемся завершения установки и стартуем Nginx

sudo service nginx restart





Пишем в браузере — ip-сервера и видим:



Работает...


Редактируем файл /etc/nginx/nginx.conf

sudo nano /etc/nginx/nginx.conf


Удаляем всё и делаем как в примере ниже:


user www-data; # Юзер от которого работает nginx
worker_processes 2; # Эта цифра должна соответствовать числу ядер у процессора
pid /var/run/nginx.pid;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	sendfile on; 
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	gzip on;
	gzip_disable "msie6";

	 gzip_min_length     1100;
	 gzip_proxied any;
	 gzip_comp_level 4;
	 gzip_buffers 16 8k;
	 gzip_http_version 1.1;
	 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

	#include /etc/nginx/naxsi_core.rules;

	#passenger_root /usr;
	#passenger_ruby /usr/bin/ruby;

	#include /etc/nginx/conf.d/*.conf; # если папка conf.d пустая, то можно закомментировать
	#include /etc/nginx/sites-enabled/*; # Отключаем дефолтный файл, так как все настройки находятся тут

server {
        listen 80;
                server_name istarik.ru www.istarik.ru; # Название Вашего сайта
                root /var/www/; # пака сервера (вдруг у Вас другая)
                index index.html index.php;

		#### xrennaideshmyphpmyadmin - это ваш секретный путь к phpMyadmin, таким образом всё 
                #### что касается phpMyadmin, будет отдавать Apache и страница будет корректно отображаться.
		#### Картинки и прочее отдаёт Nginx
		location ~* ^(?!/xrennaideshmyphpmyadmin/).+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {
                    access_log off;
                    expires 30d;
                }

                location ~ /\.ht {
                    deny all;
                }

                location / {
                    proxy_pass http://127.0.0.1:8080/; # Порт на котором висит Apache
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-for $remote_addr; 
                    proxy_set_header Host $host;
                    proxy_connect_timeout 60;
                    proxy_send_timeout 90;
                    proxy_read_timeout 90;
                    proxy_redirect off;
                    proxy_set_header Connection close;
                    proxy_pass_header Content-Type;
                    proxy_pass_header Content-Disposition;
                    proxy_pass_header Content-Length;
                }
    } 
}

Обратите внимание на комментарии.

Смотрите ниже «виртуальные хосты», там больше настроек.


Рестартуем Nginx

sudo service nginx restart


Возвращаемся в браузер, вводим адрес и видим свой сайт...


Последний штрих, сейчас в логе доступа (/var/log/apache2/access.log), показывается локальный ip (127.0.0.1). Это происходит потому что Nginx проксирует соединение.
(В принципе этого можно не делать и довольствоваться полноценным логом nginxа)


Исправим ситуацию установкой модуля libapache2-mod-rpaf

sudo apt-get install libapache2-mod-rpaf




Проверяем логи:

sudo tail -f /var/log/apache2/access.log


Чёртовы боты...)


Теперь у Вас работает связка Apache + Nginx




Несколько виртуальных хостов

На сервере будет два сайта — istarik.ru и stdelectronic.ru...

Apache

Создаём в корневой директории сервера две отдельные папки, в них будут размещены сайты:

sudo mkdir /var/www/istarik

sudo mkdir /var/www/stdelectronic

У Вас будут свои названия папок.


И копируем в эти папки содержимое сайтов…

Задаём пользователя и группу для них:

sudo chown -R www-data:www-data /var/www/istarik

sudo chown -R www-data:www-data /var/www/stdelectronic



Отключаем дефолтный конфиг апача:

sudo a2dissite default


Создаём из дефолтного конфига, конфиги новых сайтов:

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/istarik

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/stdelectronic


Дефолтный конфиг можно удалить:

sudo rm /etc/apache2/sites-available/default

… а можно и не удалять...)


Редактируем конфиг первого сайта:

sudo nano /etc/apache2/sites-available/istarik


Добавляем название сайта и меняем путь к папке:


<VirtualHost localhost:8080>
        ServerAdmin webmaster@localhost

        ServerName istarik.ru #### название Вашего сайта
        ServerAlias www.istarik.ru #### алиас Вашего сайта


        DocumentRoot /var/www/istarik #### путь к Вашему сайту

        <Directory />
                Order Deny,Allow
                Deny from all
                Options None
                AllowOverride None
        </Directory>

        <Directory /var/www/istarik/> #### путь к Вашему сайту
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None #### если ставится CMS, тогда AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
...

Сохраняем-закрываем...

То же самое для второго сайта:

sudo nano /etc/apache2/sites-available/stdelectronic



<VirtualHost localhost:8080>
        ServerAdmin webmaster@localhost

        ServerName stdelectronic.ru #### название Вашего сайта
        ServerAlias www.stdelectronic.ru #### алиас Вашего сайта


        DocumentRoot /var/www/stdelectronic #### путь к Вашему сайту

        <Directory />
                Order Deny,Allow
                Deny from all
                Options None
                AllowOverride None
        </Directory>

        <Directory /var/www/stdelectronic/> #### путь к Вашему сайту
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None #### если ставится CMS, тогда AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
...

Сохраняем-закрываем...


Активируем новые сайты:

sudo a2ensite istarik

sudo a2ensite stdelectronic


Рестартуем Apache

sudo service apache2 restart

Готово...



Nginx

Вначале создадим файл, который будем подключать в секцию проксирования.
Делаем это для того, чтоб основной конфигурационный файл (/etc/nginx/nginx.conf) был покомпактнее.

sudo touch /etc/nginx/proxy

Открываем его:

sudo nano /etc/nginx/proxy

… и вставляем строки:


proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 10;
proxy_send_timeout 10;
proxy_read_timeout 10;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;

Сохраняем...



Редактируем файл /etc/nginx/nginx.conf

sudo nano /etc/nginx/nginx.conf


Удаляем всё и делаем так:


user www-data; 
worker_processes 2; #### Эта цифра должна соответствовать числу ядер у процессора
pid /var/run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        sendfile on; 
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;
	
	reset_timedout_connection on;
	client_body_timeout 10;
	send_timeout 2;
        client_max_body_size 50m; #### Описание см. ниже
        ##### server_names_hash_bucket_size 64;
        ##### server_name_in_redirect off;
		
	limit_req_zone $binary_remote_addr zone=one:10m rate=25r/s; #### Описание см. ниже
        limit_req zone=one burst=30; #### Описание см. ниже

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;
        gzip_disable "msie6";

        gzip_min_length     1100;
        gzip_proxied any;
        gzip_comp_level 4;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        #####include /etc/nginx/naxsi_core.rules;

        #####passenger_root /usr;
        #####passenger_ruby /usr/bin/ruby;

        #####include /etc/nginx/conf.d/*.conf;
        #####include /etc/nginx/sites-enabled/*; #### Отключаем дефолтный файл, так как все настройки находятся тут

####################################################### istarik Первый сайт ##############################

	server {
        	listen 80;
                server_name istarik.ru www.istarik.ru; #### название Вашего первого сайта
		root /var/www/istarik/; #### путь к Вашему первому сайту
                index index.php index.html;

		#### Отсекать запрос по ip, зайти на сайт можно только по имени
		if ($host !~ ^(ваш_сайт.ru|www.ваш_сайт.ru)$ ) { 
			return 444;
		}
		
		#### Только GET|HEAD|POST запросы
		if ($request_method !~ ^(GET|HEAD|POST)$ ) { 
			return 444;
		}
		
		#### Отсекаем Referrer-спам, порнуху и прочую нечисть...
		if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen|pron|money|free|jwh|speed|test|cash|xxx) ){ 
		return 403;
		}
		
		#### Отсекаем качалки сайтов
		if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl|msnbot|scrapbot) {
            	return 403;
        	}

		#### xrennaideshmyphpmyadmin - это ваш секретный путь к phpMyadmin, таким образом всё 
                #### что касается phpMyadmin, будет отдавать Apache и страница будет корректно отображаться.
		#### Картинки и прочее отдаёт Nginx
		location ~* ^(?!/xrennaideshmyphpmyadmin/).+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {

                    access_log off;
                    expires 30d;
                }

		#### Запретить доступ к файлам .htaccess и .htpasswd
                location ~ /\.ht {
                   deny all;
                }

		#### Переход в Apache
                location / {
                    proxy_pass http://127.0.0.1:8080/; #### Порт на котором висит Apache
		    include /etc/nginx/proxy; #### Подключили раннее созданый файл для проксирования
                }
    		
#### Таким образом можно закрыть доступ к какой-то папке всем кроме вашего ip
####	        location /папка {
####                    allow 2.193.28.195; #### Ваш ip
####                    deny all;
####                    proxy_pass http://127.0.0.1:8080/папка;
####                    include /etc/nginx/proxy;
####            }

	} #### конец server istarik

######################################## stdelectronic Второй сайт #################################

        server {
                listen 80;
                server_name stdelectronic.ru www.stdelectronic.ru; #### название Вашего второго сайта
                root /var/www/stdelectronic/; #### путь к Вашему второму сайту
                index index.php index.html;

		#### Отсекать запрос по ip, зайти на сайт можно только по имени
                if ($host !~ ^(ваш_сайт.ru|www.ваш_сайт.ru)$ ) { 
                        return 444;
                }

		#### Только GET|HEAD|POST запросы
                if ($request_method !~ ^(GET|HEAD|POST)$ ) {
                        return 444;
                }

		#### Отсекаем Referrer-спам, порнуху и прочую нечисть...
                if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen|pron|money|free|jwh|speed|test|cash|xxx) ){ 
                return 403;
                }

		#### Отсекаем качалки сайтов
                if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl|msnbot|scrapbot) {
                return 403;
                }

                #### Картинки и прочее отдаёт Nginx
                location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx|svg)$ {

                    access_log off;
                    expires 30d;
                }

		#### Запретить доступ к файлам .htaccess и .htpasswd
                location ~ /\.ht {
                   deny all;
                }

		#### Переход в Apache
                location / {
                    proxy_pass http://127.0.0.1:8080/; #### Порт на котором висит Apache
                    include /etc/nginx/proxy; #### Подключили раннее созданый файл для проксирования
                }

#### Таким образом можно закрыть доступ к какой-то папке всем кроме вашего ip
####	        location /папка {
####                    allow 2.193.28.195; #### Ваш ip
####                    deny all;
####                    proxy_pass http://127.0.0.1:8080/папка;
####                    include /etc/nginx/proxy;
####            }
               
        } #### конец server stdelectronic

#### Вот так добавлять другие сайты
    ####server {
	        #### ...
	####}

} #### конец html

Уделите особое внимание комментариям!

Описание директив
limit_req_zone $binary_remote_addr zone=one:10m rate=25r/s;
limit_req zone=one burst=30;

Эти директивы предотвратят лёгкую ddos-атаку. Они ограничивают кол-во соединений с одного ip.

zone=one:10m — имя и размер зоны памяти для хранения текущего числа избыточных запросов.
rate=25r/s — кол-во соединений с одного ip в секунду. В данном случае, если с одного ip прийдёт больше 25-ти запросов, то сервер отдаст ошибку.
burst=30 — задаёт максимальный размер всплеска запросов.

Если скорость поступления запросов превышает описанную в зоне «one», то их обработка задерживается и обрабатывается с заданной скоростью «rate=». Избыточные запросы задерживаются до тех пор, пока их число не превысит максимальный размер «burst=», а при его превышении сервер отдаст ошибку 503.

Как настроить

Надо узнать время загрузки без директив и кол-во загруженых файлов:
1. Закомментируйте директивы.
2. Очистите кеш браузера.
3. Откройте лог:
tail -f /var/log/nginx/access.log

Если у Вас стоит CMS и файлов грузится много (30-40), то оставьте значения директив как есть, раскомментируйте их и повторите операцию с пункта 2.
Если время загрузки сильно увеличилось (на 5-10сек), то увеличьте значение «rate=» и «burst=» на 5-10 и повторите с пункта 2.
И наоборот, если время загрузки не изменилось, то уменьшите значения и добейтесь небольшого (1сек) увеличения времени загрузки.
Опять же надо понимать, что количество отдаваемого контента может увеличиваться и настраивать надо с «запасом».

Иными словами, надо сделать так, чтоб отдавалось всё быстро, но при этом чтоб сервер не расходовал ресурсы понапрасну и не падал.

Не знаю получилось ли у меня донести мысль, но так или иначе надо почитать вот тут.

Если пока не разобрались, то закоментируйте эти директивы. Ничего страшного в этом нет, когда вникните, тогда и включите.

Не спеша буду дополнять описания…


client_max_body_size 50m; — Ограничение размера загружаемого файла на сервер. Большое значение полезно если у Вас файловое хранилище.


А вот это, можно добавить в конфиг сервера для того, чтоб хулиганистые соискатели бэкапов и прочей полезной инфы на вашем сервере таки получали то, что хотели ))).
Идея заключается в том, что если «хулиган» ползает на вашем сервере в поисках файлов типа backup.zip, archive.zip и т.д., получал не просто 404 или 403, а скачивал в течении пары суток вожделенный файлик и при его распаковки «наслаждался» либо ошибкой, либо чем-то ещё.


location ~* "^/(archive|auth|backup|clients|com|dat|dump|engine|files|home|html|index|master|media|my|mysql|old|site|sql|website|wordpress)\.zip$" {
	access_log /usr/local/nginx/logs/arxiv.log;
	default_type application/zip;
	root /usr/local/nginx/html/arxiv;
	rewrite ^(.*)$ /myarxiv break;
	max_ranges 0;
	limit_rate 4k;
	include param/zone1;
}


max_ranges 0; — запрещает докачку.
limit_rate 4k; — ограничивает скорость скачивания.
include param/zone1; — Зона, где разрешен 1 коннект на 1 ип. Главное — limit_conn one 1;, one — это имя вашей зоны.

Файлик myarxiv создаём так:

dd bs=1024 count=1572864 </dev/urandom > myarxiv 


И делаем его архивом:

echo -ne \\x50\\x4b\\x03\\x04\\x14\\x00\\x00\\x00\\x08\\x00 | dd conv=notrunc bs=1 count=10 of=myarxiv




Рестартуем Nginx

sudo service nginx restart


На этом всё, заходим в браузер и проверяем...


Добавлять ещё сайты, можно по описаной схеме.

Все директивы прекрасно описаны на оф. сайте Игоря Сысоева (создателя nginx).


Полезные и нужные источники информации Apache ещё и ещё

И Nginx ещё


Обсудить на форуме...


  • +370
  • 46603
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






Комментарии (3)

0
Спасибо, даже зарегистрировался чтобы оставить комментарий. Инструкция на мой взгляд самая удобная, которую я когда-либо видел) закинул себе в закладки. Автору спасибо!
комментарий был удален
0
Всегда пожалуйста. Очень приятно читать подобные комментарии.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.