Установка и оптимальная настройка Nginx + LAMP (CentOS 7). Lamp установка centos 7


Инструкция по установке и настройке LAMP-стека на Centos 7.3

LAMP-стек представляет собой четыре самых популярных продукта для web-разработки и, как следствие этого, администрирования и хостинга web-серверов. Стеком они называются потому, что, как правило, используются совместно. Стек LAMP включает в себя:

Linux - любая ОС семейства Linux - например Centos

Apache - бесплатный web-сервер HTTPD

MariaDB (MySQL) - бесплатная версия СУБД MySQL

PHP - язык программирования для web-сайтов и web-приложений

В Centos, как правило большинство программного обеспечения распространяется в виде пакетом (специальных файлов для установки, примерный аналог MSI-пакетов в ОС Windows) через специальные хранилища - репозитории. Благодаря этому установка даже целого стека LAMP занимает немного времени и проходит достаточно быстро.

Достаточно набрать в командной строке:

yum install php mariadb-server httpd

После установки запускаем Httpd и mariadb командой systemctl.

  • systemctl это команда управления демонами (так в Linux называются службы) Linux. Команда systemctl имеет следующие основные ключи
  • systemctl status <имя службы> - статус демона
  • systemctl start <имя службы> - запуск демона
  • systemctl stop <имя службы> - остановка демона
  • systemctl enable <имя службы> - поместить демона в автозагрузку

т.е в нашем случае

  • systemctl start httpd
  • systemctl start mariadb
  • systemctl enable httpd
  • systemctl enable mariadb
  • systemctl status httpd
  • systemctl status mariadb

Производим первоначальную настройку MariaDb.

mysql_secure_installation.

MariaDb предлагает закрыть доступ анонимных пользователей - ответим утвердительно.

Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n]

Запретит пользователю root логиниться удаленно - запретим, так как ввиду неограниченности прав данного пользователя это небезопасно.

... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y

Можно убрать или оставить тестовые базы.

... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] n ... skipping.

Перечитаем таблицу прав доступа.

Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n]

После этого стек LAMP установлен - можно переходить к настройке под собственные нужды.

Поделиться в соцсетях:

Спасибо за Вашу оценку! К сожалению, проголосовать не получилось. Попробуйте позже

oblako.kz

Установка и оптимальная настройка Nginx + LAMP (CentOS 7) / СоХабр

Недавно приняли решение переехать с хостинга на VPS, будем использовать: CentOS 7, Nginx, Apache, PHP, MySQL. Несмотря на большое количество статей на эту тему, многие аспекты не упоминаются, поэтому выкладываем эту статью чтобы услышать мнение знающих и опытных людей. Настраивать сервер как Вы уже поняли будем первый раз, поэтому о актуальности статьи можно будет судить из комментариев. Nginx будет отдавать статику, а динамику Apache (скрипты PHP), чтобы снизить нагрузку на сервер.

Подготовка.

Все настройки будем применять на рабочем сервере нашего проекта с конфигурацией сервера: CPU — 2 × 2000 МГц и RAM — 2048 МБ.

Для начала работы находим подходящий VPS с предустановленной CentOS 7, к серверу будем подключаться по SSH через PuTTY.

Вводим название хоста и порт, нажимаем Open:

Далее вводим логин [Enter], потом пароль (обратите внимание, ввод пароля не отображается) [Enter]:

Обновить систему, при этом сохранить устаревшие версии пакетов:

[root@test ~]# yum update Или обновить все пакеты, старые пакеты будут удалены:[root@test ~]# yum upgrade Устанавливаем файловый менеджер с текстовым интерфейсом — Midnight Commander:[root@test ~]# yum install mc Устанавливаем текстовый редактор — Nano:[root@test ~]# yum install nano Проверяем сколько на сервере оперативной памяти и сколько доступно, а также наличие SWAP. Когда заканчивается оперативная память, данные перемещаются на диск, что замедляет работу сервера, работа SWAP нежелательна, но позволяет подстраховать себя:[root@test ~]# free -mСоздаём файловую структуру и пользователей под сайты.

Создаём каталог (папку) для файлов под все сайты:

[root@test ~]# cd / [root@test ~]# mkdir -m 755 websiteПод каждый отдельный сайт выполните такие действия.

Содержимое каждого сайта будет находиться в собственном каталоге, поэтому создаём нового пользователя и отдельный каталог для разграничения прав доступа:  -b папка в которой будет создан каталог пользователя  -m создать каталог  -U создаём группу с таким же именем как у пользователя  -s /bin/false отключаем пользователю shell

[root@test ~]# useradd name.site -b /website/ -m -U -s /bin/false Делаем каталоги для данных сайта (файлы сайта, логи и временные файлы):[root@test ~]# mkdir -p -m 754 /website/name.site/www [root@test ~]# mkdir -p -m 754 /website/name.site/logs [root@test ~]# mkdir -p -m 777 /website/name.site/tmp Изменяем владельца и группу на каталог, включая вложенные папки:[root@test ~]# chown -R name.site:name.site /website/name.site/ Изменяем права доступа на каталог — name.site:[root@test ~]# chmod 755 /website/name.siteУстанавливаем Nginx.

Инструкции по установке приведены на официальном сайте Nginx.

Для настройки репозитория yum в CentOS создаём файл /etc/yum.repos.d/nginx.repo:

[root@test ~]# cd /etc/yum.repos.d [root@test ~]# touch nginx.repo Открываем файл nginx.repo:[root@test ~]# nano /etc/yum.repos.d/nginx.repo Вставляем такое содержимое и сохраняем файл:[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=1 enabled=1 Для проверки подписи загружаем ключ и импортируем его в менеджер пакетов rpm:[root@test ~]# rpm --import http://nginx.org/keys/nginx_signing.key Устанавливаем Nginx:[root@test ~]# yum install nginx Запускаем:[root@test ~]# systemctl start nginx.service

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

[root@test ~]# systemctl stop nginx.serviceУстанавливаем Apache и PHP.

Устанавливаем Apache (в CentOS — httpd):

[root@test ~]# yum install httpd Устанавливаем PHP:[root@test ~]# yum install php Запускаем Apache:[root@test ~]# systemctl start httpd.service Временно останавливаем:[root@test ~]# systemctl stop httpd.serviceНастраиваем Nginx.

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

[root@test ~]# systemctl enable nginx.service Открываем основной конфигурационный файл:[root@test ~]# nano /etc/nginx/nginx.conf Редактируем и сохраняем:/etc/nginx/nginx.confuser nginx; worker_processes 2; pid /var/run/nginx.pid;

events {  worker_connections 1024;  multi_accept on; }

http {  error_log /var/log/nginx/error.log warn;  access_log off;    charset utf-8;  server_tokens off;    include /etc/nginx/mime.types;  default_type application/octet-stream;    reset_timedout_connection on;  client_header_timeout 15;  client_body_timeout 30;  send_timeout 15;  keepalive_timeout 5;  keepalive_requests 30;  client_max_body_size 8m;    limit_rate_after 30M;  limit_rate 500K;    open_file_cache max=10000 inactive=3m;  open_file_cache_min_uses 2;  open_file_cache_valid 1m;    sendfile on;  tcp_nodelay on;  tcp_nopush on;    include /etc/nginx/conf.d/*.conf; }

От какого пользователя запускаем Nginx:user nginx; Указываем количество рабочих процессов (зависит от количества ядер процессора и количества жёстких дисков, потому что головка диска быстрее перемещаться не сможет):worker_processes 2; Идентификатор процесса запущенного сервера:pid  /var/run/nginx.pid; Секция events:events {  # } Внутри блока events, максимальное количество одновременных соединении с сервером (worker_processes × worker_connections):worker_connections 1024; Внутри блока events, принимать соединения сколько будет возможно:multi_accept on; Секция http, остальное будет находиться внутри неё:http {  # } Записывать ошибки (уровня: warn, error, crit, alert) по указанному пути:error_log /var/log/nginx/error.log warn; Отключаем запись журнала доступа (жёсткий диск скажет спасибо):access_log off; Установим кодировку по умолчанию:charset utf-8; Отключим показ версии Nginx:server_tokens off; Подключить mimetypes:include  /etc/nginx/mime.types; Если MIME-тип файла не удастся определить, то по умолчанию файл будет бинарным:default_type application/octet-stream; Закрывать соединение если клиент не отвечает:reset_timedout_connection on; Читать заголовок запроса клиента не более 15 секунд:client_header_timeout 15; Читать тело запроса клиента не более 30 секунд — интервал устанавливается не на всю передачу тела запроса, а только между двумя последовательными операциями чтения:client_body_timeout 30; Если клиент не принимает ответ более 15 секунд, сбрасываем соединение:send_timeout 15; Держим соединение открытым не более пяти секунд:keepalive_timeout 5; Максимальное количество запросов с открытым соединением от одного клиента:keepalive_requests 30; Запросы больше 8 мегабайт принимать не будем:client_max_body_size 8m; Чтобы один пользователь не занял весь свободный канал трафика, после 30 Мб наложим ограничение на скорость отдачи данных:limit_rate_after 30M; Максимальная скорость с клиентом в рамках одного соединения после наложенных ограничений будет не более 500 Кб/с:limit_rate 500K; Устанавливаем максимальное количество файлов, информация о которых будет содержаться в кеше и удаляться, если файл не будет запрошен повторно в течении 3 минут:open_file_cache max=10000 inactive=3m; Если файл будет запрошен более 2 раз, поместить в кэш:open_file_cache_min_uses 2; Проверять актуальность кэша каждую минуту:open_file_cache_valid 1m; Отдавать статику без посредников:sendfile on; Не буферизировать данные:tcp_nodelay on; Отправлять заголовки одним пакетом:tcp_nopush on; Подключить конфиги:include /etc/nginx/conf.d/*.conf;Для каждого сайта создаём виртуальный хост Nginx.

Чтобы Nginx получил доступ к файлам сайта, добавим пользователя nginx в группу name.site:

[root@test ~]# usermod -a -G name.site nginx Затем создаём конфигурационный файл:[root@test ~]# touch /etc/nginx/conf.d/name.site.conf Открываем файл:[root@test ~]# nano /etc/nginx/conf.d/name.site.conf Редактируем и сохраняем:/etc/nginx/conf.d/name.site.confserver {  listen  80;  server_name name.site www.name.site;  #access_log /website/name.site/logs/nginx_access.log;  error_log /website/name.site/logs/nginx_error.log;

 location / {   proxy_pass http://127.0.0.1:8080/;   proxy_read_timeout 300s;   proxy_set_header Host $host;   proxy_set_header X-Real-IP $remote_addr;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   proxy_buffering off;  }    location ~* \.(css|js|png|gif|jpg|jpeg|ico)$ {   root /website/name.site/www;   expires 1d;  } 

 error_page 500 502 503 504 /50x.html;  location = /50x.html {   root /usr/share/nginx/html;  } }

Сервер слушает на 80 порту:listen  80; Имя сервера, определяет в каком блоке будет выполнен запрос, указывается имя домена:server_name name.site www.name.site; Путь к журналу ошибок Nginx конкретного сайта:error_log /serves/name.site/logs/nginx_error.log; Перенаправить запрос Apache:proxy_pass http://127.0.0.1:8080/; Обрывать коннект через 300 секунд, если превышен таймаут при чтении ответа с сервера Apache:proxy_read_timeout 300s; Передать заголовки:proxy_set_header Host $host; Передать IP клиента:proxy_set_header X-Real-IP $remote_addr; Передать список серверов по которым прошёл запрос и добавить свой:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; Отключить буферизацию проксируемого сервера:proxy_buffering off; Статику будет отдавать Nginx:location ~* \.(css|js|png|gif|jpg|jpeg|ico)$ {  root /serves/name.site/www;  expires 1d; }Настраиваем Apache.

Посмотрите какой именно модуль Apache у вас установлен. У меня — apache2-mpm-prefork (один процесс с одним потоком будет обрабатывать одно соединение, рекомендуется как безопасный совместно с PHP):

[root@test ~]# apachectl -V Открываем httpd.conf:[root@test ~]# nano /etc/httpd/conf/httpd.conf Редактируем и сохраняем:httpd.confServerRoot "/etc/httpd" DocumentRoot "/website" Include conf.modules.d/*.conf

User apache Group apache

Listen 127.0.0.1:8080 ServerName 127.0.0.1:8080 ServerAdmin root@localhost

ServerSignature Off ServerTokens Prod

RLimitMEM 786432000 TimeOut 250

AddDefaultCharset utf-8 DefaultLanguage ru

KeepAlive Off ContentDigest Off EnableSendfile off

ErrorLog "logs/error_log" LogLevel error

<IfModule mime_module>  TypesConfig /etc/mime.types </IfModule>

<Directory />  DirectoryIndex index.php  AllowOverride none  Require all denied </Directory>

<IfModule mpm_prefork_module>  StartServers 5  MinSpareServers 5  MaxSpareServers 10  MaxClients 30  MaxRequestsPerChild 2500 </IfModule>

<Files ".ht*">  Require all denied </Files>

IncludeOptional sites-enabled/*.conf

Устанавливаем корневой каталог Apache:ServerRoot "/etc/httpd" Каталог где будут храниться файлы сайтов:DocumentRoot "/website" Подгружаем конфигурационные файлы:Include conf.modules.d/*.conf От какого пользователя запускаем сервер:User apache От какой группы запускаем сервер:Group apache Указываем IP и порт с которых будем принимать запросы, снаружи этот сервер видно не будет:Listen 127.0.0.1:8080 Имя хоста и порт для определения самого себя:ServerName 127.0.0.1:8080 Адрес электронной почты который отправляется клиенту в случае ошибок:ServerAdmin root@localhost Отключаем отправку информации версии системы и сервера Apache:ServerSignature Off Отключаем отправку клиенту в заголовке информацию о Apache:ServerTokens Prod Ограничиваем использование памяти 750 мегабайтами:RLimitMEM 786432000 Максимальное время приёма запроса, обработки, отправки контента серверу Nginx:TimeOut 250 Устанавливаем кодировку:AddDefaultCharset utf-8 Задаём язык содержимого:DefaultLanguage ru Отключаем обработку большого количества запросов в одном соединении:KeepAlive Off Выключить генерацию Content-MD5 заголовков HTTP:ContentDigest Off Apache статику отдавать не будет, поэтому отключаем:EnableSendfile off Записываем ошибки Apache по указанному пути /etc/httpd/logs/error_log:ErrorLog "logs/error_log" Указываем c какого уровня записывать ошибки: LogLevel error Подключить mimetypes:<IfModule mime_module>  TypesConfig /etc/mime.types </IfModule> Секция Directory:<Directory />  ... </Directory> Внутри блока Directory, в случае указания пути до каталога, по умолчанию отдавать index.php::DirectoryIndex index.php Внутри блока Directory, запретить переопределение информации доступа в .htaccess:AllowOverride none Внутри блока Directory, запретить доступ к файлам сервера:Require all denied Секция mpm_prefork_module:<IfModule mpm_prefork_module>  ... </IfModule> Внутри блока mpm_prefork_module, после запуска Apache создать 5 процессов:StartServers 5 Внутри блока mpm_prefork_module, минимальное количество неиспользуемых процессов (если все процессы будут заняты, то запустятся новые свободные процессы):MinSpareServers 5 Внутри блока mpm_prefork_module, максимальное количество неиспользуемых (запасных) процессов:MaxSpareServers 10 Внутри блока mpm_prefork_module, максимальное количество дочерних процессов которые можно запустить одновременно, остальные встают в очередь (с увеличением дочерних процессов, увеличивается потребление памяти):MaxClients 30 Внутри блока mpm_prefork_module, после указанного числа обработанных запросов, процесс перезапускается (необходимо при переполнении — утечки памяти):MaxRequestsPerChild 2500 Закрываем доступ к .htaccess:<Files ".ht*">  Require all denied </Files> Подгружаем конфигурационные файлы:IncludeOptional sites-enabled/*.confДля каждого сайта создаём виртуальный хост Apache.

Добавляем пользователя apache в группу каждого сайта:

[root@test ~]# usermod -a -G name.site apache Создаём каталог под конфигурационные файлы виртуальных хостов Apache:[root@test ~]# mkdir /etc/httpd/sites-enabled Создаём конфигурационный файл:[root@test ~]# touch /etc/httpd/sites-enabled/name.site.conf Открываем файл:[root@test ~]# nano /etc/httpd/sites-enabled/name.site.conf Редактируем и сохраняем:/etc/httpd/sites-enabled/name.site.conf<VirtualHost *:8080>  ServerName name.site  ServerAlias www.name.site

 DocumentRoot /website/name.site/www

 <Directory "/website/name.site">   AllowOverride None   Require all granted  </Directory>

 DirectoryIndex index.php

 ErrorLog /website/name.site/logs/error.log  CustomLog /website/name.site/logs/requests.log combined </VirtualHost>

Блок VirtualHost, указывается какой порт слушать:

<VirtualHost *:8080>  ... </VirtualHost> Имя домена:ServerName name.site Зеркало домена:ServerAlias www.name.site Каталог где будут храниться файлы этого сайта:DocumentRoot /website/name.site/www Открыть доступ к файлам сайта:Require all granted Если путь указан до каталога, по умолчанию открывать:DirectoryIndex index.php Путь к журналу ошибок Apache конкретного сайта:ErrorLog /website/name.site/logs/error.log Путь к журналу доступа:CustomLog /website/name.site/logs/requests.log combinedПроверка Nginx и Apache.

Добавляем Apache в автозагрузку:

[root@test ~]# systemctl enable httpd.service Создаём, редактируем и сохраняем файл:[root@test ~]# touch /website/name.site/www/index.php [root@test ~]# nano /website/name.site/www/index.php Копируем конфиг php:[root@test ~]# cp /etc/httpd/conf.d/php.conf /etc/httpd/sites-enabled/php.conf Запускаем Nginx и Apache:[root@test ~]# systemctl start nginx.service [root@test ~]# systemctl start httpd.serviceНастраиваем PHP.

Открываем php.ini:

[root@test ~]# nano /etc/php.ini Редактируем и сохраняем:/etc/php.iniengine = On expose_php = Off short_open_tag = Off zlib.output_compression = Off disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc

display_startup_errors = Off display_errors = Off log_errors = On error_log = "/usr/local/zend/var/log/php.log" ignore_repeated_errors = Off ignore_repeated_source = Off html_errors = On

implicit_flush = Off output_buffering = 4K realpath_cache_size = 2M realpath_cache_ttl = 1800 zend.enable_gc = On

max_input_time = 200 max_execution_time = 30 file_uploads = On

memory_limit = 256M post_max_size = 8M upload_max_filesize = 2M max_file_uploads = 4

extension_dir = "/usr/local/zend/lib/php_extensions" date.timezone = Europe/Moscow default_mimetype = "text/html" default_charset = "UTF-8"

variables_order = "CGPS" register_argc_argv = Off auto_globals_jit = On enable_dl = Off

allow_url_fopen = On allow_url_include = Off

Включаем интерпретатор PHP, по необходимости можно выключить на конкретном сайте:engine = On Отключаем заголовки отправляемые клиенту о PHP:expose_php = Off Отключаем короткую запись тегов PHP … ?>:short_open_tag = Off Выключаем сжатие страниц:zlib.output_compression = Off Отключаем опасные функции:disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc Не выводить на экран ошибки возникшии во время старта PHP:display_startup_errors = Off Не показывать ошибки:display_errors = Off Логируем ошибки, после выключения их вывода на экран:log_errors = On Файл в который будут записываться ошибки:error_log = "/usr/local/zend/var/log/php.log" Не записывать одинаковые ошибки, которые проиcходят в конкретном файле и строке (ignore_repeated_source — нужно выключить):ignore_repeated_errors = Off При включении не записывает одинаковые ошибки, которые могут происходить в разных файлах и строках, поэтому выключаем:ignore_repeated_source = Off Выключить HTML теги при просмотре сообщений об ошибках:html_errors = On Складываем данные в буфер:implicit_flush = OffБуферизация вывода для всех файлов, максимальное количество:output_buffering = 4K Используем кэш realpath, тем самым уменьшая количество вызовов stat():realpath_cache_size = 2M Установим время хранения кэша 30 минут:realpath_cache_ttl = 1800 Включаем сборщик циклических ссылок:zend.enable_gc = On Указываем максимальное время в течении которого будут приниматься данные на сервер (POST, GET, HEAD), время измеряется с запуска PHP до момента выполнения скрипта:max_input_time = 200 Указываем максимальное время выполнения скрипта (значение не больше чем в Apache — Timeout) — вместо set_time_limit: max_execution_time = 30 Разрешить загрузку файлов на сервер:file_uploads = On Максимальный размер памяти, который можно использовать скрипту:memory_limit = 256M Максимальный размер данных, отправляемых методом POST (должно быть меньше — memory_limit):post_max_size = 8M Максимальный размер закачиваемого файла (должно быть меньше — post_max_size):upload_max_filesize = 2M Количество файлов, которые можно передать за один запрос:max_file_uploads = 4 Путь до каталога с модулями расширения:extension_dir = "/usr/local/zend/lib/php_extensions" Устанавливаем временную зону:date.timezone = Europe/Moscow Тип данных:default_mimetype = "text/html" Устанавливаем кодировку UTF-8:default_charset = "UTF-8" Порядок обработки переменных — $_COOKIE, $_GET, $_POST, $_SERVER:variables_order = "CGPS" Не объявлять переменные argv и argc:register_argc_argv = Off Переменные SERVER и ENV будут создаваться в момент использования, что приводит к увеличению производительности:auto_globals_jit = On Выключаем динамическую подгрузку, влияет на безопасность:enable_dl = Off Разрешаем работу с внешними файлами по URL:allow_url_fopen = On Отключаем использование внешних файлов:allow_url_include = OffУстанавливаем и настраиваем MySQL.

Отрываем my.cnf:

[root@test ~]# nano /etc/mysql/my.cnf Количество параллельных процессов, обрабатывающих конкурентные запросы к MySQL (количество ядер умноженных на два):thread_concurrency = 4 Устанавливаем кодировку по умолчанию для новых таблиц:default-character-set = utf8 Будем использовать таблицы InnoDB:default-storage-engine = InnoDB Устанавливаем размер буфера индексов таблиц в оперативной памяти (актуально для таблиц MyISAM):key_buffer_size = 5M Буфер данных и индексов таблиц — InnoDB:innodb_buffer_pool_size = 300M Максимальный размер оперативной памяти, выделяемой для временных таблиц, создаваемых MySQL:tmp_table_size = 50M Максимальное количество открытых таблиц, которые будут находиться в кэше:table_open_cache = 64 Буфер данных, который используется для записи информации на диск — InnoDB:innodb_log_buffer_size = 0M Отключаем кэширование запросов:query_cache_size = 0 Размер буфера который используется для сортировки (ORDER BY) или группировки GROUP BY) данных в каждом потоке:sort_buffer_size = 512K Выделяем для каждого потока память на каждую таблицу, при увеличении этого значения может пострадать скорость выполнения запроса:read_buffer_size = 512K Влияет на скорость сортировки, для запросов с — ORDER BY:read_rnd_buffer_size = 1M Размер буфера с использованием JOIN, если не используются индексы в этих запросах:join_buffer_size = 2M Размер стека, место для хранения списка задач (открыть или закрыть таблицу, выполнить запрос и т.п.):thread_stack = 1M Выделяем память для буфера соединения и его результатов, может быть увеличено до max_allowed_packet:net_buffer_length = 30K Максимальный размер данных, которые можно передать за один запрос:max_allowed_packet = 5M Максимальное количество одновременных соединений:max_connections = 75 Количество соединений, которые могут стоять в очереди:back_log = 250 Слушать только localhost:bind-address = 127.0.0.1 Не использовать TCP/IP соединения, передавать данные через сокет:skip-networking Чтобы рассчитать примерное потребление оперативной памяти на сервере MySQL (насколько я понял) можно воспользоваться следующей формулой (не забывайте, что серверу Apache уже выделено 750 МБ и ещё нужно оставить серверу Nginx):key_buffer_size + innodb_buffer_pool_size + tmp_table_size + ((sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack) × max_connections) = ?Немного про безопасность.

Под root заходить нежелательно, поэтому создаём нового пользователя:

[root@test ~]# adduser newuser Задаём пароль пользователю — newuser:[root@test ~]# passwd newuser Устанавливаем пакет sudo:[root@test ~]# yum install sudo Заносим нового пользователя в sudo:[root@test ~]# gpasswd -a newuser wheel Если вы подключаетесь к SSH через 22 порт, то нужно его изменить, открываем sshd_config:[root@test ~]# nano /etc/ssh/sshd_config Меняем порт на любой свободный (не забываем через установленный у вас firewall закрыть 22 порт и открыть новый, например 54139):Port 54139 Запрещаем попытку входа с пустым паролем:PermitEmptyPasswords no Запретим вход в терминал root:PermitRootLogin no Разрешим логиниться в терминале только новому пользователю — newuser:AllowUsers newuser Перезагружаем ssh:[root@test ~]# service sshd restart

P.S. Можно использовать Nginx с php-fpm, но есть такое мнение, что при правильно настроенном Apache особой разницы в производительности не наблюдается.

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

sohabr.net

Установка и оптимальная настройка Nginx + LAMP (CentOS 7)

Недавно приняли решение переехать с хостинга на VPS, будем использовать: CentOS 7, Nginx, Apache, PHP, MySQL. Несмотря на большое количество статей на эту тему, многие аспекты не упоминаются, поэтому выкладываем эту статью чтобы услышать мнение знающих и опытных людей. Настраивать сервер как Вы уже поняли будем первый раз, поэтому о актуальности статьи можно будет судить из комментариев.

Подготовка.

Все настройки будем применять на рабочем сервере нашего проекта с конфигурацией сервера: CPU — 2 × 2000 МГц и RAM — 2048 МБ.

Для начала работы находим подходящий VPS с предустановленной CentOS 7, к серверу будем подключаться по SSH через PuTTY.

Вводим название хоста и порт, нажимаем Open:

Далее вводим логин [Enter], потом пароль (обратите внимание, ввод пароля не отображается) [Enter]:

Обновить систему, при этом сохранить устаревшие версии пакетов:

[root@test ~]# yum update

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

[root@test ~]# yum upgrade

Устанавливаем файловый менеджер с текстовым интерфейсом — Midnight Commander:

[root@test ~]# yum install mc

Устанавливаем текстовый редактор — Nano:

[root@test ~]# yum install nano

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

[root@test ~]# free -m

Создаём файловую структуру и пользователей под сайты.

Создаём каталог (папку) для файлов под все сайты:

[root@test ~]# cd /[root@test ~]# mkdir -m 755 website

Под каждый отдельный сайт выполните такие действия.

Содержимое каждого сайта будет находиться в собственном каталоге, поэтому создаём нового пользователя и отдельный каталог для разграничения прав доступа: -b папка в которой будет создан каталог пользователя -m создать каталог -U создаём группу с таким же именем как у пользователя -s /bin/false отключаем пользователю shell

[root@test ~]# useradd name.site -b /website/ -m -U -s /bin/false

Делаем каталоги для данных сайта (файлы сайта, логи и временные файлы):

[root@test ~]# mkdir -p -m 754 /website/name.site/www[root@test ~]# mkdir -p -m 754 /website/name.site/logs[root@test ~]# mkdir -p -m 777 /website/name.site/tmp

Изменяем владельца и группу на каталог, включая вложенные папки:

[root@test ~]# chown -R name.site:name.site /website/name.site/

Изменяем права доступа на каталог — name.site:

[root@test ~]# chmod 755 /website/name.site

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

Инструкции по установке приведены на официальном сайте Nginx.

Для настройки репозитория yum в CentOS создаём файл /etc/yum.repos.d/nginx.repo:

[root@test ~]# cd /etc/yum.repos.d[root@test ~]# touch nginx.repo

Открываем файл nginx.repo:

[root@test ~]# nano /etc/yum.repos.d/nginx.repo

Вставляем такое содержимое и сохраняем файл:

[nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/7/$basearch/gpgcheck=1enabled=1

Для проверки подписи загружаем ключ и импортируем его в менеджер пакетов rpm:

[root@test ~]# rpm --import http://nginx.org/keys/nginx_signing.key

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

[root@test ~]# yum install nginx

Запускаем:

[root@test ~]# systemctl start nginx.service

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

[root@test ~]# systemctl stop nginx.service

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

Устанавливаем Apache (в CentOS — httpd):

[root@test ~]# yum install httpd

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

[root@test ~]# yum install php

Запускаем Apache:

[root@test ~]# systemctl start httpd.service

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

[root@test ~]# systemctl stop httpd.service

Настраиваем Nginx.

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

[root@test ~]# systemctl enable nginx.service

Открываем основной конфигурационный файл:

[root@test ~]# nano /etc/nginx/nginx.conf

Редактируем и сохраняем:

/etc/nginx/nginx.conf

user nginx;worker_processes 2;pid /var/run/nginx.pid;

events { worker_connections 1024; multi_accept on;}

http { error_log /var/log/nginx/error.log warn; access_log off;  charset utf-8; server_tokens off;  include /etc/nginx/mime.types; default_type application/octet-stream;  reset_timedout_connection on; client_header_timeout 10; client_body_timeout 25; send_timeout 8; keepalive_timeout 5; keepalive_requests 30; client_max_body_size 8m;  limit_rate_after 30M; limit_rate 500K;  open_file_cache max=10000 inactive=3m; open_file_cache_min_uses 2; open_file_cache_valid 1m;  sendfile on; tcp_nodelay on; tcp_nopush on;  include /etc/nginx/conf.d/*.conf;}

От какого пользователя запускаем Nginx:

user nginx;

Указываем количество рабочих процессов (зависит от количества ядер процессора и количества жёстких дисков, потому что головка диска быстрее перемещаться не сможет):

worker_processes 2;

Идентификатор процесса запущенного сервера:

pid  /var/run/nginx.pid;

Секция events:

events { #}

Внутри блока events, максимальное количество одновременных соединении с сервером (worker_processes × worker_connections):

worker_connections 1024;

Внутри блока events, принимать соединения сколько будет возможно:

multi_accept on;

Секция http, остальное будет находиться внутри неё:

http { #}

Записывать ошибки (уровня: warn, error, crit, alert) по указанному пути:

error_log /var/log/nginx/error.log warn;

Отключаем запись журнала доступа (жёсткий диск скажет спасибо):

access_log off;

Установим кодировку по умолчанию:

charset utf-8;

Отключим показ версии Nginx:

server_tokens off;

Подключить mimetypes:

include  /etc/nginx/mime.types;

Если MIME-тип файла не удастся определить, то по умолчанию файл будет бинарным:

default_type application/octet-stream;

Закрывать соединение если клиент не отвечает:

reset_timedout_connection on;

Читать заголовок запроса клиента не более 10 секунд:

client_header_timeout 10;

Читать тело запроса клиента не более 25 секунд — интервал устанавливается не на всю передачу тела запроса, а только между двумя последовательными операциями чтения:

client_body_timeout 25;

Если клиент не принимает ответ более 8 секунд, сбрасываем соединение:

send_timeout 8;

Держим соединение открытым не более пяти секунд:

keepalive_timeout 5;

Максимальное количество запросов с открытым соединением от одного клиента:

keepalive_requests 30;

Запросы больше 8 мегабайт принимать не будем:

client_max_body_size 8m;

Чтобы один пользователь не занял весь свободный канал трафика, после 30 Мб наложим ограничение на скорость отдачи данных:

limit_rate_after 30M;

Максимальная скорость с клиентом в рамках одного соединения после наложенных ограничений будет не более 500 Кб/с:

limit_rate 500K;

Устанавливаем максимальное количество файлов, информация о которых будет содержаться в кеше и удаляться, если файл не будет запрошен повторно в течении 3 минут:

open_file_cache max=10000 inactive=3m;

Если файл будет запрошен более 2 раз, поместить в кэш:

open_file_cache_min_uses 2;

Проверять актуальность кэша каждую минуту:

open_file_cache_valid 1m;

Отдавать статику без посредников:

sendfile on;

Не буферизировать данные:

tcp_nodelay on;

Отправлять заголовки одним пакетом:

tcp_nopush on;

Подключить конфиги:

include /etc/nginx/conf.d/*.conf;

Для каждого сайта создаём виртуальный хост Nginx.

Чтобы Nginx получил доступ к файлам сайта, добавим пользователя nginx в группу name.site:

[root@test ~]# usermod -a -G name.site nginx

Затем создаём конфигурационный файл:

[root@test ~]# touch /etc/nginx/conf.d/name.site.conf

Открываем файл:

[root@test ~]# nano /etc/nginx/conf.d/name.site.conf

Редактируем и сохраняем:

/etc/nginx/conf.d/name.site.conf

server { listen  80; server_name name.site www.name.site; #access_log /website/name.site/logs/nginx_access.log; error_log /website/name.site/logs/nginx_error.log;

 location / {  proxy_pass http://localhost:8080/;  proxy_read_timeout 300s;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_buffering off;    proxy_set_header Range "";  proxy_set_header Request-Range ""; }  location ~* .(css|js|png|gif|jpg|jpeg|ico)$ {  root /website/name.site/www;  expires 1d; } 

 error_page 500 502 503 504 /50x.html; location = /50x.html {  root /usr/share/nginx/html; }}

Сервер слушает на 80 порту:

listen  80;

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

server_name name.site www.name.site;

Путь к журналу ошибок Nginx конкретного сайта:

error_log /serves/name.site/logs/nginx_error.log;

Перенаправить запрос Apache:

proxy_pass http://localhost:8080/;

Обрывать коннект через 300 секунд, если превышен таймаут при чтении ответа с сервера Apache:

proxy_read_timeout 300s;

Передать заголовки:

proxy_set_header Host $host;

Передать IP клиента:

proxy_set_header X-Real-IP $remote_addr;

Передать список серверов по которым прошёл запрос и добавить свой:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Отключить буферизацию проксируемого сервера:

proxy_buffering off;

Защита от killapache:

proxy_set_header Range "";proxy_set_header Request-Range "";

Статику будет отдавать Nginx:

location ~* .(css|js|png|gif|jpg|jpeg|ico)$ { root /serves/name.site/www; expires 1d;}

Настраиваем Apache.

Посмотрите какой именно модуль Apache у вас установлен. У меня — apache2-mpm-prefork (один процесс с одним потоком будет обрабатывать одно соединение, рекомендуется как безопасный совместно с PHP):

[root@test ~]# apachectl -V

Открываем httpd.conf:

[root@test ~]# nano /etc/httpd/conf/httpd.conf

Редактируем и сохраняем:

httpd.conf

ServerRoot "/etc/httpd"DocumentRoot "/website"Include conf.modules.d/*.conf

User apacheGroup apache

Listen 127.0.0.1:8080ServerName 127.0.0.1:8080ServerAdmin root@localhost

ServerSignature OffServerTokens Prod

RLimitMEM 786432000TimeOut 250

AddDefaultCharset utf-8DefaultLanguage ru

KeepAlive OffContentDigest OffEnableSendfile off

ErrorLog "logs/error_log"LogLevel error

<IfModule mime_module> TypesConfig /etc/mime.types</IfModule>

<Directory /> DirectoryIndex index.php AllowOverride none Require all denied</Directory>

<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 30 MaxRequestsPerChild 2500</IfModule>

<Files ".ht*"> Require all denied</Files>

IncludeOptional sites-enabled/*.conf

Устанавливаем корневой каталог Apache:

ServerRoot "/etc/httpd"

Каталог где будут храниться файлы сайтов:

DocumentRoot "/website"

Подгружаем конфигурационные файлы:

Include conf.modules.d/*.conf

От какого пользователя запускаем сервер:

User apache

От какой группы запускаем сервер:

Group apache

Указываем IP и порт с которых будем принимать запросы, снаружи этот сервер видно не будет:

Listen 127.0.0.1:8080

Имя хоста и порт для определения самого себя:

ServerName 127.0.0.1:8080

Адрес электронной почты который отправляется клиенту в случае ошибок:

ServerAdmin root@localhost

Отключаем отправку информации версии системы и сервера Apache:

ServerSignature Off

Отключаем отправку клиенту в заголовке информацию о Apache:

ServerTokens Prod

Ограничиваем использование памяти 750 мегабайтами:

RLimitMEM 786432000

Максимальное время приёма запроса, обработки, отправки контента серверу Nginx:

TimeOut 250

Устанавливаем кодировку:

AddDefaultCharset utf-8

Задаём язык содержимого:

DefaultLanguage ru

Отключаем обработку большого количества запросов в одном соединении:

KeepAlive Off

Выключить генерацию Content-MD5 заголовков HTTP:

ContentDigest Off

Apache статику отдавать не будет, поэтому отключаем:

EnableSendfile off

Записываем ошибки Apache по указанному пути /etc/httpd/logs/error_log:

ErrorLog "logs/error_log"

Указываем c какого уровня записывать ошибки:

LogLevel error

Подключить mimetypes:

<IfModule mime_module> TypesConfig /etc/mime.types</IfModule>

Секция Directory:

<Directory /> ...</Directory>

Внутри блока Directory, в случае указания пути до каталога, по умолчанию отдавать index.php::

DirectoryIndex index.php

Внутри блока Directory, запретить переопределение информации доступа в .htaccess:

AllowOverride none

Внутри блока Directory, запретить доступ к файлам сервера:

Require all denied

Секция mpm_prefork_module:

<IfModule mpm_prefork_module> ...</IfModule>

Внутри блока mpm_prefork_module, после запуска Apache создать 5 процессов:

StartServers 5

Внутри блока mpm_prefork_module, минимальное количество неиспользуемых процессов (если все процессы будут заняты, то запустятся новые свободные процессы):

MinSpareServers 5

Внутри блока mpm_prefork_module, максимальное количество неиспользуемых (запасных) процессов:

MaxSpareServers 10

Внутри блока mpm_prefork_module, максимальное количество дочерних процессов которые можно запустить одновременно, остальные встают в очередь (с увеличением дочерних процессов, увеличивается потребление памяти):

MaxClients 30

Внутри блока mpm_prefork_module, после указанного числа обработанных запросов, процесс перезапускается (необходимо при переполнении — утечки памяти):

MaxRequestsPerChild 2500

Закрываем доступ к .htaccess:

<Files ".ht*"> Require all denied</Files>

Подгружаем конфигурационные файлы:

IncludeOptional sites-enabled/*.conf

Для каждого сайта создаём виртуальный хост Apache.

Добавляем пользователя apache в группу каждого сайта:

[root@test ~]# usermod -a -G name.site apache

Создаём каталог под конфигурационные файлы виртуальных хостов Apache:

[root@test ~]# mkdir /etc/httpd/sites-enabled

Создаём конфигурационный файл:

[root@test ~]# touch /etc/httpd/sites-enabled/name.site.conf

Открываем файл:

[root@test ~]# nano /etc/httpd/sites-enabled/name.site.conf

Редактируем и сохраняем:

/etc/httpd/sites-enabled/name.site.conf

<VirtualHost *:8080> ServerName name.site ServerAlias www.name.site

 DocumentRoot /website/name.site/www

 <Directory "/website/name.site">  AllowOverride None  Require all granted </Directory>

 DirectoryIndex index.php

 ErrorLog /website/name.site/logs/error.log CustomLog /website/name.site/logs/requests.log combined</VirtualHost>

Блок VirtualHost, указывается какой порт слушать:

<VirtualHost *:8080> ...</VirtualHost>

Имя домена:

ServerName name.site

Зеркало домена:

ServerAlias www.name.site

Каталог где будут храниться файлы этого сайта:

DocumentRoot /website/name.site/www

Открыть доступ к файлам сайта:

Require all granted

Если путь указан до каталога, по умолчанию открывать:

DirectoryIndex index.php

Путь к журналу ошибок Apache конкретного сайта:

ErrorLog /website/name.site/logs/error.log

Путь к журналу доступа:

CustomLog /website/name.site/logs/requests.log combined

Проверка Nginx и Apache.

Добавляем Apache в автозагрузку:

[root@test ~]# systemctl enable httpd.service

Создаём, редактируем и сохраняем файл:

[root@test ~]# touch /website/name.site/www/index.php[root@test ~]# nano /website/name.site/www/index.php

Копируем конфиг php:

[root@test ~]# cp /etc/httpd/conf.d/php.conf /etc/httpd/sites-enabled/php.conf

Запускаем Nginx и Apache:

[root@test ~]# systemctl start nginx.service[root@test ~]# systemctl start httpd.service

Настраиваем PHP.

Открываем php.ini:

[root@test ~]# nano /etc/php.ini

Редактируем и сохраняем:

/etc/php.ini

engine = Onexpose_php = Offshort_open_tag = Offzlib.output_compression = Offdisable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc

display_startup_errors = Offdisplay_errors = Offlog_errors = Onerror_log = "/usr/local/zend/var/log/php.log"ignore_repeated_errors = Offignore_repeated_source = Offhtml_errors = On

implicit_flush = Offoutput_buffering = 4Krealpath_cache_size = 2Mrealpath_cache_ttl = 1800zend.enable_gc = On

max_input_time = 200max_execution_time = 30file_uploads = On

memory_limit = 128Mpost_max_size = 8Mupload_max_filesize = 2Mmax_file_uploads = 4

extension_dir = "/usr/local/zend/lib/php_extensions"date.timezone = Europe/Moscowdefault_mimetype = "text/html"default_charset = "UTF-8"

variables_order = "CGPS"register_argc_argv = Offauto_globals_jit = Onenable_dl = Off

allow_url_fopen = Onallow_url_include = Off

Включаем интерпретатор PHP, по необходимости можно выключить на конкретном сайте:

engine = On

Отключаем заголовки отправляемые клиенту о PHP:

expose_php = Off

Отключаем короткую запись тегов PHP <?… ?>:

short_open_tag = Off

Выключаем сжатие страниц:

zlib.output_compression = Off

Отключаем опасные функции:

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc

Не выводить на экран ошибки возникшии во время старта PHP:

display_startup_errors = Off

Не показывать ошибки:

display_errors = Off

Логируем ошибки, после выключения их вывода на экран:

log_errors = On

Файл в который будут записываться ошибки:

error_log = "/usr/local/zend/var/log/php.log"

Не записывать одинаковые ошибки, которые проиcходят в конкретном файле и строке (ignore_repeated_source — нужно выключить):

ignore_repeated_errors = Off

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

ignore_repeated_source = Off

Выключить HTML теги при просмотре сообщений об ошибках:

html_errors = On

Складываем данные в буфер:

implicit_flush = Off

Буферизация вывода для всех файлов, максимальное количество:

output_buffering = 4K

Используем кэш realpath, тем самым уменьшая количество вызовов stat():

realpath_cache_size = 2M

Установим время хранения кэша 30 минут:

realpath_cache_ttl = 1800

Включаем сборщик циклических ссылок:

zend.enable_gc = On

Указываем максимальное время в течении которого будут приниматься данные на сервер (POST, GET, HEAD), время измеряется с запуска PHP до момента выполнения скрипта:

max_input_time = 200

Указываем максимальное время выполнения скрипта (значение не больше чем в Apache — Timeout) — вместо set_time_limit:

max_execution_time = 30

Разрешить загрузку файлов на сервер:

file_uploads = On

Максимальный размер памяти, который можно использовать скрипту:

memory_limit = 256M

Максимальный размер данных, отправляемых методом POST (должно быть меньше — memory_limit):

post_max_size = 8M

Максимальный размер закачиваемого файла (должно быть меньше — post_max_size):

upload_max_filesize = 2M

Количество файлов, которые можно передать за один запрос:

max_file_uploads = 4

Путь до каталога с модулями расширения:

extension_dir = "/usr/local/zend/lib/php_extensions"

Устанавливаем временную зону:

date.timezone = Europe/Moscow

Тип данных:

default_mimetype = "text/html"

Устанавливаем кодировку UTF-8:

default_charset = "UTF-8"

Порядок обработки переменных — $_COOKIE, $_GET, $_POST, $_SERVER:

variables_order = "CGPS"

Не объявлять переменные argv и argc:

register_argc_argv = Off

Переменные SERVER и ENV будут создаваться в момент использования, что приводит к увеличению производительности:

auto_globals_jit = On

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

enable_dl = Off

Разрешаем работу с внешними файлами по URL:

allow_url_fopen = On

Отключаем использование внешних файлов:

allow_url_include = Off

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

Отрываем my.cnf:

[root@test ~]# nano /etc/mysql/my.cnf

Количество параллельных процессов, обрабатывающих конкурентные запросы к MySQL (количество ядер умноженных на два):

thread_concurrency = 4

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

default-character-set = utf8

Будем использовать таблицы InnoDB:

default-storage-engine = InnoDB

Устанавливаем размер буфера индексов таблиц в оперативной памяти (актуально для таблиц MyISAM):

key_buffer_size = 5M

Буфер данных и индексов таблиц — InnoDB:

innodb_buffer_pool_size = 300M

Максимальный размер оперативной памяти, выделяемой для временных таблиц, создаваемых MySQL:

tmp_table_size = 50M

Максимальное количество открытых таблиц, которые будут находиться в кэше:

table_open_cache = 64

Буфер данных, который используется для записи информации на диск — InnoDB:

innodb_log_buffer_size = 0M

Отключаем кэширование запросов:

query_cache_size = 0

Размер буфера который используется для сортировки (ORDER BY) или группировки GROUP BY) данных в каждом потоке:

sort_buffer_size = 512K

Выделяем для каждого потока память на каждую таблицу, при увеличении этого значения может пострадать скорость выполнения запроса:

read_buffer_size = 512K

Влияет на скорость сортировки, для запросов с — ORDER BY:

read_rnd_buffer_size = 1M

Размер буфера с использованием JOIN, если не используются индексы в этих запросах:

join_buffer_size = 2M

Размер стека, место для хранения списка задач (открыть или закрыть таблицу, выполнить запрос и т.п.):

thread_stack = 1M

Выделяем память для буфера соединения и его результатов, может быть увеличено до max_allowed_packet:

net_buffer_length = 30K

Максимальный размер данных, которые можно передать за один запрос:

max_allowed_packet = 5M

Максимальное количество одновременных соединений:

max_connections = 75

Количество соединений, которые могут стоять в очереди:

back_log = 250

Слушать только localhost:

bind-address = 127.0.0.1

Не использовать TCP/IP соединения, передавать данные через сокет:

skip-networking

Чтобы рассчитать примерное потребление оперативной памяти на сервере MySQL (насколько я понял) можно воспользоваться следующей формулой (не забывайте, что серверу Apache уже выделено 750 МБ и ещё нужно оставить серверу Nginx):

key_buffer_size + innodb_buffer_pool_size + tmp_table_size + ((sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack) × max_connections) = ?

Немного про безопасность.

Под root заходить нежелательно, поэтому создаём нового пользователя:

[root@test ~]# adduser newuser

Задаём пароль пользователю — newuser:

[root@test ~]# passwd newuser

Устанавливаем пакет sudo:

[root@test ~]# yum install sudo

Заносим нового пользователя в sudo:

[root@test ~]# gpasswd -a newuser wheel

Если вы подключаетесь к SSH через 22 порт, то нужно его изменить, открываем sshd_config:

[root@test ~]# nano /etc/ssh/sshd_config

Меняем порт на любой свободный:

Port 54139

Запрещаем попытку входа с пустым паролем:

PermitEmptyPasswords no

Запретим вход в терминал root:

PermitRootLogin no

Разрешим логиниться в терминале только новому пользователю — newuser:

AllowUsers newuser

Перезагружаем ssh:

[root@test ~]# service sshd restart

P.S. Можно использовать Nginx с php-fpm, но есть такое мнение, что при правильно настроенном Apache особой разницы в производительности не наблюдается.

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

Автор: XAKPM

Источник

www.pvsm.ru

Установка LAMP на CentOS 6. Инструкция

LAMP – это набор программного обеспечения для управления веб-серверами. Дословно, аббревиатура расшифровывается как Linux + Apache + MySQL + PHP. В представленной инструкции будет рассмотрено весь процесс установки веб-сервера Apache, сервера баз данных MySQL и PHP.

Для дальнейших действий необходимо подключится к серверу через SSH под root-доступом. Для подключения можно использовать программу PuTTY.

1. Обновление всех пакетов

Для обновления всех имеющихся пакетов необходимо выполнить следующую команду.

2. Установка Apache

shell> yum -y install httpd

shell> yum -y install httpd

После выполнения команды выше, проверяем правильность установки, для этого вбиваем в терминал:

shell> rpm -qa | grep -i httpd httpd-2.2.15-54.el6.centos.x86_64

shell> rpm -qa | grep -i httpd

 

httpd-2.2.15-54.el6.centos.x86_64

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

shell> service httpd start shell> chkconfig httpd on

shell> service httpd start

shell> chkconfig httpd on

Последним шагом остается открыть 80-ый порт в файрволе, для этого выполняем следующее.

shell> iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT shell> service iptables save

shell> iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

shell> service iptables save

Все, установка Apache завершена, чтобы проверить корректность работы, вбейте в адресной строке браузера http://ip_сервера. Если все было правильно установлено, то нам должна открыться тестовая страница Apache.

3. Установка MySQL

Следующим этап является установка сервера баз данных MySQL, для этого выполняем в терминале слудующую команду.

shell> yum -y install mysql-server

shell> yum -y install mysql-server

Проверяем результаты установки.

valerykoretsky.com

Centos 7 установка и настройка apache

Управление виртуальными хостами Apache HTTP Server в CentOS 7 – Duration:.

Если у вас еще нет сервера, то вам надо выполнить установку CentOS 7. А если сервер уже установлен, то не забудьте его настроить. Рекомендую обратить внимание именно на настройку, так как там много полезной информации, которую в рамках этой статьи я не даю — обновление системы, настройка фаервола, установка редактора и многое другое.

Установка и настройка Apache, PHP, MySQL на CentOS (+ PMA и FTP). CentOS 7: # systemctl stop firewalld &amp;&amp; systemctl disable firewalld .

Настройка centos 7 LAMP , установка apache + mysql + Php на Centos 7, настройка сервера linux, Удалённое.

В данной статье помимо минимального набора команд для установки LAMP на CentOS 7, я расскажу о повышении безопасности Вашего сервера. Мне часто приходится работать с проектами различных сайтов, обладая знаниями и опытом администрирования ОС Linux, было решено поднять собственный веб сервер на базе CentOS 7, для тестирования и отладки проектов. Мы не будем отключать SELinux, вместо этого настроим его для использования на веб сервере, вдобавок выполним установку и базовую настройку Firewalld.

Установка и настройка Apache, PHP, MySQL на CentOS (+ PMA и FTP). CentOS 7: # systemctl stop firewalld &amp;&amp; systemctl disable firewalld .

Вам прямо сейчас нужно 24. Поддержим на русском языке 24/7/365 Работаем с юрлицами и физлицами.

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

А в «1С-Битрикс: Виртуальная машина» все эти настройки уже выполнены. Кроме того, важно обеспечить безопасность. «1С-Битрикс: Виртуальная машина» – отличное решение проблемы качественной настройки хостинга и выделенных серверов. Обычно, чтобы добиться высокой производительности проекта, необходимо самостоятельно настроить серверное ПО, ОС, оборудование. В итоге, вы экономите время и деньги на развертывании и настройке сервера, на покупке необходимого оборудования, на обеспечении безопасности проекта.

Установка и настройка Apache, PHP, MySQL на CentOS (+ PMA и FTP). CentOS 7: # systemctl stop firewalld && systemctl disable firewalld.

Теперь приступим к установке apache. В CentOS 7 это делается очень просто :.

Да, разобрался в итоге, там в итоге была проблема не в самом каталоге,а в сокет файле мускула. D конфиг странички, загружается только она, а gpli выдает 404 ошибку. Теперь вот проблема с виртуальными хостами. Я так понимаю это из-за параметра DocumentRoot, указанного в моем конфиге для сайта. На этом моменте я туплю. Но стоит только добавить в conf. Я поставил GLPI и все работает по ссылке типа http://x.

offerov.net

Установка LAMP на CentOS 7

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

Так уж получилось, что хостер, где ранее размещались все сайты и некоторые сервисы, оказался жлоб и пидарас. Жлоб, потому как на самом дорогом тарифе выделял лишь сраные 256Mb под всё, а пидарас — потому как и с поддержкой — не очень хорошо, и хосты частенько лежали, и отношение к клиентам — далеко не лучшее. Да, речь о Nic.ru.

Было решено переезжать. Но куда? В России достойное по соотношению цена/качества — не находилось, а “за бугром”, по рекомендациям хабра — был выбран hetzner.de.

Сказано — сделано. Только куплен не хостинг, а виртуальный выделенный сервер, с характеристиками:

  • Камень: Intel® Core™2 Duo CPU T7700 @ 2.40GHz
  • Кэш камня: 4096 KB
  • Память: 994.1 MB
  • Сеть: добрые 50 МБит
  • ОС: на выбор, но я ставил CentOS Linux 7.0.1406 (x64)

После того что было - есть где разгуляться. А самое главное - почти за те же деньги. Остается всё поставить и настроить.

Ставить мы будем вот что:

  • nginx в качестве фронтэнда;
  • httpd (Apache 2) + php в качестве бэкэнда;
  • vsftpd - ftp сервер;
  • mariadb (mysql) в качестве сервера БД с мордой phpMyAdmin.

Этот пост — скорее как шпаргалка для самого себя, т.к. уже успел сервер положить на лопатки, и пришлось всё делать заново (к слову — бэкап, разумеется, был; а настройки удалось выдернуть, загрузившись с рековери-образа в режиме восстановления). Но, как говорит мой товарищ “Хорош пиздеть, поехали”:

Ставим стартовый набор и обновляемся:

$ yum update; yum install nano mc

Правим имя хоста:

$ nano /etc/hostname

Изменяем DNS-сервера на российские (от Яндекса - 77.88.8.8 и 77.88.8.1):

$ nano /etc/resolv.conf

Правим вид консоли, придаем ей человеческий образ, и ставим в качестве редактора по умолчанию - nano:

$ nano ~/.bashrc export VISUAL=nano export EDITOR=nano # Custom bash prompt via kirsle.net/wizards/ps1.html export PS1="[$(tput bold)][$(tput setaf 7)][[$(tput setaf 1)]u[$(tput setaf 7)]@[$(tput setaf 5)]h [$(tput setaf 2)]w[$(tput setaf 7)]]\$ [$(tput sgr0)]"

Изменяем порт ssh на нетипичный, например - 23432:

$ nano /etc/ssh/sshd_config Port 23432 Protocol 2

И перезапускаем ssh сервер (после коннектимся на новый порт):

$ service sshd restart

Создаем swap и монтируем его:

$ dd if=/dev/zero of=/swap bs=1M count=1024 $ mkswap /swap $ swapon /swap

И чтоб swap монтировался при запуске системы (сам он этого делать не будет) добавляем swapon /swap в /etc/rc.local.

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

$ useradd kot $ passwd kot

Меняем рабочую директория (т.к. у меня всего один пользователь и планировался, то я его переместил сходу в /home/):

$ usermod -m -d /home/ kot; chown kot:kot /home/

Ставим FTP:

$ yum install vsftpd

Настраиваем:

$ nano /etc/vsftpd/vsftpd.conf

И (пере)запускаем:

$ service vsftpd restart

Примерный конфиг у меня такой:

anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES listen_port=12312 xferlog_std_format=YES idle_session_timeout=3600 data_connection_timeout=3600 listen=NO listen_ipv6=YES force_dot_files=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES

Демон висит на порту 12312, соединение по таймауту с ходу не обрывает, скрытые директории и файлы - показывает.

Потом меня забесил темно-синий цвет в выводе ls - ну не видно нихера. Изменил его (на DIR 01;36):

$ nano /etc/DIR_COLORS

Продолжаем установку пакетов:

$ yum install zip unzip bzip bzip2

Ставим поддержку распаковки из rar-архивов (надо для одного сервиса):

$ wget http://pkgs.repoforge.org/unrar/unrar-4.0.7-1.el6.rf.x86_64.rpm $ rpm -Uvh unrar-4.0.7-1.el6.rf.x86_64.rpm $ rm unrar-4.0.7-1.el6.rf.x86_64.rpm

Ставим web-сервисы и иже с ними:

$ yum install httpd nginx mariadb-server php phpMyAdmin crontabs htop iptables-services

Настраиваем httpd (Apache 2):

$ nano /etc/httpd/conf/httpd.conf

Для апача также ставим mod_realip2 (по этой инструкции, в комментарии к посту по ссылке одно важное замечание), иначе в логах будет 127.0.0.1 вместо реального адреса пользователя. Настраиваем его на работу на 8080 порту.

Ставим так же и mod_geoip для определения - откуда пользователь (настройку его производите самостоятельно, и не забудьте - .dat файлы необходимы в периодическом обновлении):

$ yum install geoip geoip-devel

После всех настроек выполняем (пере)запуск httpd демона, материмся, анализируем причину “почему не заработало”, правим, и снова (пере)запускаем:

$ service httpd restart

Т.к. phpMyAdmin у нас уже стоит, он по умолчанию доступен отовсюду по ссылке %виртуалхост%/phpmyadmin. Это мы исправляем, и разрешаем лишь на “главном хосте”, для чего конфиг “главного хоста” у нас может быть таким:

<VirtualHost *:8080> ServerName localhost.local DocumentRoot /home/main.host/docs <Directory "/home/main.host/docs"> AllowOverride All Require all granted Satisfy all </Directory> Alias /phpMyAdmin/ /usr/share/phpMyAdmin/ <Directory /usr/share/phpMyAdmin/> AddDefaultCharset UTF-8 Require all granted </Directory> </VirtualHost>

А сам конфиг %phpmyadmin%.conf из /etc/httpd/conf.d/ (или /etc/httpd/conf.modules.d/) сносим к ебеням.

Так же выполняем первоначальную настройку:

$ mysql mysql> DROP DATABASE test; mysql> USE mysql; mysql> UPDATE user SET Password=PASSWORD('MyMysqlPassword') WHERE user='root'; mysql> FLUSH PRIVILEGES; mysql> quit

Далее - настраиваем nginx:

$ nano /etc/nginx/nginx.conf

И настраиваем его на работу на 80 порту, и что можно отдавать им - отдаем им, остальное - пропускаем на апач - proxy_pass http://127.0.0.1:8080/;.

Далее - БД, Машка (MariaDB, она же MySQL). Правим конфиг:

$ nano /etc/my.cnf

И доводим его примерно до такого вида:

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 key_buffer = 16M max_allowed_packet = 4M table_cache = 32 sort_buffer_size = 2M read_buffer_size = 4M read_rnd_buffer_size = 2M net_buffer_length = 20K thread_stack = 640K tmp_table_size = 16M query_cache_limit = 1M query_cache_size = 4M skip-networking skip-federated skip-blackhole skip-archive skip-external-locking [mysqldump] quick max_allowed_packet = 16M [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid !includedir /etc/my.cnf.d

Делая её работу чуть “попроще”, да и запрещая доступ к БД “извне”. И (пере)запускаем:

$ service mariadb restart

На данный момент у нас должно уже всё работать. Закрываем извне доступ к апачу, т.к. у нас весь трафик ходит через nginx:

$ iptables -A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j DROP $ service iptables save

Ещё одна тонкость - давай ограничим количество соединений по SSH до, скажем, четырех в минуту. Тем самым защитившись от перебора паролей ssh (ssh порт у нас 23432):

$ iptables -A INPUT -p tcp --dport 23432 -i eth0 -m state --state NEW -m recent --set $ iptables -A INPUT -p tcp --dport 23432 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP $ service iptables save

Так же есть смысл сразу настроить logrotate.

А после всего запустить htop, откинуться на спинку, и сказать - “А это было совсем не сложно”.

Ссылки, которые могут быть так же интересны:

blog.hook.sh