Как поднять Debian сервер под хостинг 1С-Битрикс

Цель:

Создать сервер для хостинга проектов на 1С-Битрикс.


Оборудование:

CPU: Intel® Xeon® E3-1245 (Quad-Core)
RAM: 16 GB DDR3 RAM ECC
HDD: 2 x 3 TB SATA 6 Gb/s HDD 7200 rpm (RAID 1)

ОС:

Debian 6 (64bit), чистая минимальная установка

Оглавление


1. Начальная настройка и подготовка сервера
2. Установка Apache, MySQL, PHP
3. Настройка Apache
4. Настройка MySQL
5. Настройка PHP
6. Настройка FTP
7. Настройка iptables
8. Оптимизация

1. Начальная настройка и подготовка сервера


Меняем время на нужное для нас

1

2

3

4

# rm /etc/localtime

# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Убаждаемся, что команда hostname выдает правильное имя сервера. Это же имя должно быть в файле /etc/hosts напротив IP-адреса. Если такоего нет, задаем:

1

2

3

# hostname www.vcore.ru

Файл /etc/hosts:

1

2

3

4

127.0.0.1 localhost

5.9.94.197www.vcore.ru

Для начала добавляем репозитории, откуда будут браться пакеты. Их два — репозиторий Zend и репозиторий, откуда мы будем устанавливать MySQL версии 5.5
В файл /etc/apt/sources.list добавляем следующие строчки:

1

2

3

4

5

6

7

## Zend Server

deb http://repos.zend.com/zend-server/deb server non-free

## MySQL Server 5.5

deb http://packages.dotdeb.org squeeze all

deb-src http://packages.dotdeb.org squeeze all

Добавляем ключи репозиторием:

1

2

3

4

# wget http://repos.zend.com/zend.key -O- |apt-key add -

# wget http://www.dotdeb.org/dotdeb.gpg -O- |apt-key add -

Обновляем установленные пакеты (если есть такие):

1

2

3

4

# apt-get update

# apt-get upgrade

2. Установка Apache, MySQL, PHP


Ставим сразу все. Это все одна длинная-длинная строчка.

1

2

3

# apt-get install zend-base libapache2-mod-php-5.3-zend-server php-5.3-xmlrpc-zend-server php-5.3-optimizer-plus-zend-server php-5.3-zem-zend-server php-5.3-curl-zend-server php-5.3-data-cache-zend-server php-5.3-mbstring-zend-server php-5.3-mcrypt-zend-server php-5.3-memcache-zend-server php-5.3-mysql-zend-server php-5.3-mysqli-zend-server php-5.3-gd-zend-server php-5.3-ctype-zend-server php-5.3-json-zend-server php-5.3-dev-zend-server mysql-server

Я не стал ставить phpmyadmin, потому что не хочу давать напрямую доступ к базе. Любую работу с БД можно производить через панель управления Битрикс, а администратору проще все делать через консоль.

3. Настройка Apache


Все настройки сайтов будут храниться в папке /etc/apache2/sites-enabled/

Там уже есть один сайт по умолчанию 000-defaul. Я создаю сайты по следующему принципу <трехзначный номер клиента>-<домен>. Т.е. все сайты с индексом 000 — это сайты, которые принадлежат владельцу сервера. Сайты с индексом 001 — это первый клиент, 002 — второй клиент и т.д. <домен> — это... как ни странно... домен.

Я покажу пример настройки двух своих сайтов. Файлы одинаковые, за исключением переменных ServerName, ServerAlias, DocumentRoot и директории сайта. Так же, надо помнить, что для Битрикс надо устанавливать значение AllowOverride All, чтобы обрабатывались файлы .htaccess.

/etc/apache2/sites-enabled/000-default:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

&lt;VirtualHost *:80&gt;

ServerName www.vcore.ru

ServerAlias vcore.ru

ServerAdmin info@vcore.ru

DocumentRoot /var/www/vcore.ru/

&lt;Directory /&gt;

Options FollowSymLinks

AllowOverride None

&lt;/Directory&gt;

&lt;Directory /var/www/vcore.ru/&gt;

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

&lt;/Directory&gt;

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

&lt;Directory &quot;/usr/lib/cgi-bin&quot;&gt;

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Order allow,deny

Allow from all

&lt;/Directory&gt;

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel error

CustomLog ${APACHE_LOG_DIR}/access.log combined

&lt;/VirtualHost&gt;

/etc/apache2/sites-enabled/000-shieldz.ru:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

&lt;VirtualHost *:80&gt;

ServerName www.shieldz.ru

ServerAlias shieldz.ru

ServerAdmin info@vcore.ru

DocumentRoot /var/www/shieldz.ru/

&lt;Directory /&gt;

Options FollowSymLinks

AllowOverride None

&lt;/Directory&gt;

&lt;Directory /var/www/shieldz.ru/&gt;

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

&lt;/Directory&gt;

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

&lt;Directory &quot;/usr/lib/cgi-bin&quot;&gt;

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Order allow,deny

Allow from all

&lt;/Directory&gt;

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel error

CustomLog ${APACHE_LOG_DIR}/access.log combined

&lt;/VirtualHost&gt;

Сами сайты хранятся в папке /var/www/
Устанавливаем права:

1

2

3

4

# chown -R www-data:www-data /var/www/*

# chmod -R 755 /var/www/*

Если вы работаете с файлами сайта через консоль, то владельцем файла или папки становитс тот пользователь, от которого вы работаете. После внесения любых изменений в файлы сайта, лучше заново выполнять команду chown.

Пока что на этом все. Apache запускать еще рано. Не торопимся.

4. Настройка MySQL


Тип всех таблиц в базах данных я устанавливаю в InnoDB, соответственно файл конфигурации будет приведен под максимальную производительность именно InnoDB, а не MyISAM.

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

1

2

3

# mysql_secure_installation

К сожалению, база данных уже будет запущена. Почему к сожалению? Потому что дальше будет ошибка.
А пока что заходим в бд и убеждаемся, что нет записей с пустыми паролями

1

2

3

# mysql -u root -p

1

2

3

4

&gt; USE mysql;

&gt; SELECT host, user, password FROM user;

Если есть пустые пароли, меняем их

1

2

3

&gt; SET PASSWORD FOR '<пользователь>'@'<хост>' = PASSWORD('<пароль>');

Далее, нам надо создать файл конфигурации. За основу берем файл my-huge.cnf, которые доступен в качестве примера в документации к MySQL. Забираем этот файл.

1

2

3

4

5

# cd /usr/share/doc/mysql-server-5.5/examples/

# gunzip my-huge.cnf.gz

# cp my-huge.cnf /etc/mysql/my.cnf

Файл /etc/mysql/my.cnf (с комментариями в ключевых моментах):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

[client]

port= 3306

socket= /var/run/mysqld/mysqld.sock

[mysqld]

port= 3306

socket= /var/run/mysqld/mysqld.sock

skip-external-locking

# задаем максимальное число подключений

# я бы не стал задавать больше 300, если вы не знаете зачем это

max_connections = 250

# со всеми этими параметрами можно поиграть для улучшения производительности

# для меня эти работают наиболее удачно

# в основном они относятся к таблицам MyISAM, а не InnoDB

key_buffer_size = 64M

thread_stack = 128K

max_allowed_packet = 1M

table_open_cache = 64M

join_buffer_size = 8M

sort_buffer_size = 8M

read_buffer_size = 8M

read_rnd_buffer_size = 8M

myisam_sort_buffer_size = 64M

thread_cache_size = 16

query_cache_size = 128M

query_cache_limit = 1M

# судя по тестам, значение в 2000 является наиболее удачным

table_cache = 2048

# Количество ядер процессора умножаем на 2

thread_concurrency = 8

# рекомендация Битрикс

transaction-isolation= READ-COMMITTED

# указываем, что хотим по умолчанию использовать innodb

default-storage-engine= innodb

# кодировка по умолчанию

character-set-server= utf8

collation-server= utf8_general_ci

innodb_data_home_dir = /var/lib/mysql

innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend

innodb_log_group_home_dir = /var/lib/mysql

# выставляем значение где-то 50 - 80 % от объема оперативной памяти

innodb_buffer_pool_size = 4G

innodb_additional_mem_pool_size = 20M

# не более 25 % от размера innodb_buffer_pool_size

innodb_log_file_size = 256M

innodb_log_buffer_size = 8M

# рекомендация Битрикс

innodb_flush_log_at_trx_commit = 2

# рекомендация Битрикс

innodb_flush_method = O_DIRECT

innodb_lock_wait_timeout = 50

[mysqldump]

quick

max_allowed_packet = 16M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 256M

sort_buffer_size = 256M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

Вот теперь-то и возникает та оишбка, о которой я говорил раньше. Нам надо перезагрузить сервер MySQL. Но сделать это не получится.

Останаливаем сервер БД и удаляеем следующие файлы:

1

2

3

4

5

# /etc/init.d/mysql stop

# rm /var/lib/mysql/ib*

# /etc/init.d/mysql start

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

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

1

2

3

# mysql -u root -p

Создание базы данных:

1

2

3

&gt; CREATE DATABASE &lt;имя бд&gt;;

Назначение прав на базу данных (обращаем внимание на кавычки):

1

2

3

4

&gt; GRANT ALL PRIVILEGES ON &lt;имя бд&gt;.* TO '<имя пользователя>'@'localhost' IDENTIFIED BY '<пароль>';

&gt; FLUSH PRIVILEGES;

Восстановление базы данных из бекапа (эта команда выполняется просто из консоли):

1

2

3

# mysql -u root -p <имя бд> < <файл.sql>

5. Настройка PHP


Настроек PHP не так уж и много. Выполняем рекомендации и требования 1С-Битрикс и делаем следующие изменения в файле /usr/local/zend/etc/php.ini:

1

2

3

4

5

6

allow_call_time_pass_reference = On

realpath_cache_size = 4096K

upload_max_filesize = 20M

date.timezone = &quot;Europe/Moscow&quot;

Перезагружаем веб-сервер:

1

2

3

# /etc/init.d/apache2 restart

6. Настройка FTP


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

1

2

3

# apt-get install proftpd

В файле /etc/proftpd/proftpd.conf я лишь внес следующие изменения:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

ServerName&quot;vCore LTD FTP Server&quot;

RootLogin off

MaxLoginAttempts5

AllowRetrieveRestart on

AllowStoreRestart on

DirFakeGroup on

tcpNoDelay on

DeleteAbortedStores on

AllowForeignAddress on

UseReverseDNS off

RequireValidShell off

PassivePorts49152 49155

Как создавать пользователей? Легко, командой useradd
— d — домашнаяя директория пользователя (т.е. то, где находится сайт)
— g — группа, к которой принадлежит пользователь
— M — не надо создавать домашнюю директорию
— N — не создавать одноименную группу с именем пользователя

1

2

3

# useradd -d /var/www/vcore.ru -g www-data -M -N vcore

Далее задаем пароль для созданного пользователя

1

2

3

# passwd vcore

7. Настройка iptables


Создаем файл /etc/iptables.rules со следующим содержанием:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

*filter

# Разрешаем любой траффик на интерфейс lo0, а весь траффик 127/8 блокируем, если он не идет черерз lo0

-A INPUT -i lo -j ACCEPT

-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT

# Пропускаем установленные входящие

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешаем любой исходящий

-A OUTPUT -j ACCEPT

# Разраешаем HTTP и HTTPS

-A INPUT -p tcp --dport 80 -j ACCEPT

-A INPUT -p tcp --dport 443 -j ACCEPT

# Разрешаем SSH

# --src 123.123.123.123 - это адрес, откуда пускать ssh, можно указать несколько адресов через запятую

-A INPUT -p tcp -m state --state NEW --dport 22 --src 123.123.123.123 -j ACCEPT

# Разрешаем FTP

# можно использовать --src, как и в предыдущем примере, если пускать надо лишь с определенных адресов

-A INPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT

-A INPUT -p tcp -m state --state NEW --dport 49152 -j ACCEPT

-A INPUT -p tcp -m state --state NEW --dport 49153 -j ACCEPT

-A INPUT -p tcp -m state --state NEW --dport 49154 -j ACCEPT

-A INPUT -p tcp -m state --state NEW --dport 49155 -j ACCEPT

# Разрешаем пинг

-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# Заносим в лог всё запрещенное

-A INPUT -m limit --limit 5/min -j LOG --log-prefix &quot;iptables denied: &quot; --log-level 7

# Запрещаем все остальное (политика "запрещаем все, если не указано иначе")

-A INPUT -j REJECT

-A FORWARD -j REJECT

COMMIT

Далее, чтобы правлиа заработали выполняем следующую команду:

1

2

3

# iptables-restore < /etc/iptables.rules

Оптимизация


Самый большой прирост в производительности (по крайней мере в мониторе производительности в Битрикс) дает включение APC-кеша. Для этого надо в файле bitrix/php_interface/dbconn.php добавить следующие строчки:

1

2

3

4

define(&quot;BX_CACHE_TYPE&quot;, &quot;apc&quot;);

define(&quot;BX_CACHE_SID&quot;, $_SERVER[&quot;DOCUMENT_ROOT&quot;]);

Найдена статья на сайте vanyukov_su .