Для организации web сервера установим на CentOS 7 связку nginx + php-fpm. Подразумевается, что у вас уже есть настроенный сервер CentOS 7, если нет, то рекомендую статью на эту тему - CentOS 7 настройка сервера. Связка nginx и php fpm дает большую производительность, нежели apache с php.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Содержание:
Установка nginx на CentOS 7
Ставим непосредственно web сервер:
# yum install -y nginx
Добавляем в автозагрузку:
# systemctl enable nginx.service
И запускаем:
# systemctl start nginx.service
Проверяем, запустился ли:
# netstat -tulpn | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21585/nginx: master
Теперь можно зайти на тестовую страничку, чтобы убедиться, что nginx работает:
http://ip_сервера
Не забудьте открыть 80-й порт на фаерволе.
Установка mysql на CentOS 7
Практически ни один web сервер сейчас не обходится без mysql. В centos 7 вместо mysql устанавливается mariadb, которая имеет полную совместимость с mysql, в том числе понимает все ее команды. Так что ставим на сервер:
# yum install -y mariadb mariadb-server net-tools
Добавляем в автозапуск:
# systemctl enable mariadb.service ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'
И запускаем:
# systemctl start mariadb.service
Проверяем, запустилась ли mysql:
# netstat -tulpn | grep mysql tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 21488/mysqld
Все в порядке.
Теперь воспользуемся скриптом безопасности, который позволит задать пароль root и произвести некоторые настройки:
# /usr/bin/mysql_secure_installation /usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] y New password: Re-enter new password: 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] y ... 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] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
Установка php-fpm на CentOS 7
Устанавливаем php-fpm и некоторые модули, которые скорее всего пригодятся в дальнейшей работе:
# yum install -y php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap
Так же я предлагаю установить APC - бесплатный и открытый кэшер кода PHP, который кэширует и оптимизирует промежуточный код PHP, ускоряя его исполнение. Установим APC из хранилища PHPpecl. Для того, чтобы скомпилировать пакет APC нужно установить Centos Development tools.
# yum install -y php-devel # yum groupinstall 'Development Tools'
Компилируем APC:
# pecl install apc
На все вопросы просто жмем enter, выбирая параметры по-умолчанию.
Теперь отредактируем /etc/php.ini как нам рекомендует инсталлятор:
# mcedit /etc/php.ini
Задаем параметр cgi.fix_pathinfo=0 и добавляем в конце строку extension=apc.so
Заодно установим сразу же часовой пояс: date.timezone = "Europe/Moscow"
Создадим файл настроек APC:
# mcedit /etc/php.d/apc.ini extension = apc.so apc.enabled = 1 apc.cache_by_default = 1 apc.ttl = 7200 apc.shm_size = 64M apc.max_file_size = 4M apc.stat = 1
Добавляем php-fpm в автозагрузку:
# systemctl enable php-fpm.service ln -s '/usr/lib/systemd/system/php-fpm.service' '/etc/systemd/system/multi-user.target.wants/php-fpm.service'
И запускаем:
# systemctl start php-fpm.service
Проверяем:
# netstat -tulpn | grep php-fpm tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2907/php-fpm: maste
Настройка nginx и php-fpm на CentOS 7
Теперь отредактируем конфиги для совместной работы. Приводим конфиг nginx к следующему виду:
# mcedit /etc/nginx/nginx.conf user nginx; worker_processes 1; pid /var/run/nginx.pid; error_log /var/log/nginx-error.log warn; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; server_tokens off; fastcgi_intercept_errors on; client_max_body_size 50m; server { listen 80; server_name www.site1.ru; rewrite ^ http://site1.ru$request_uri? permanent; } # wordpress server { listen 80; server_name site1.ru; root /web/sites/site1.ru/www/; index index.php index.html index.htm; access_log /web/sites/site1.ru/log/access.log main; error_log /web/sites/site1.ru/log/error.log; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico)$ { access_log off; expires max; } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /web/sites/site1.ru/www/; fastcgi_param SCRIPT_FILENAME /web/sites/site1.ru/www$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /web/sites/site1.ru/www$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } # phpmyadmin server { listen 80; server_name pma.site1.ru; root /web/sites/pma.site1.ru/www/; index index.php index.html index.htm; access_log /web/sites/pma.site1.ru/log/access.log main; error_log /web/sites/pma.site1.ru/log/error.log; location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /web/sites/pma.site1.ru/www/; fastcgi_param SCRIPT_FILENAME /web/sites/pma.site1.ru/www$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /web/sites/pma.site1.ru/www$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } } }
worker_processes рекомендуется сделать равным количеству ядер процессора
fastcgi_pass указывает на unix сокет, по которому идет связь с php-fpm
site1.ru - адрес сайта с блогом wordpress, настройки приведены специально под него
pma.site1.ru - отдельный виртуальный домен под phpmyadmin, его мы поставим позже
Более подробно о том, как выполнить базовую настройку nginx читайте в отдельной обширной статье.
Перезапускаем nginx:
# systemctl restart nginx.service
Теперь правим конфиг php-fpm, приводим его к следующему виду:
# mcedit /etc/php-fpm.d/www.conf [www] listen = /var/run/php-fpm/php5-fpm.sock listen.allowed_clients = 127.0.0.1 user = nginx group = nginx # как будут создаваться новые рабочие процессы pm = dynamic # максимальное оличество рабочих процессов pm.max_children = 10 # число запущенных процессов при старте сервера pm.start_servers = 2 # минимальное и максимальное количество процессов в простое pm.min_spare_servers = 1 pm.max_spare_servers = 3 slowlog = /var/log/php-fpm/www-slow.log php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session
Перезапускаем php-fpm:
# systemctl restart php-fpm.service
Создаем необходимые каталоги:
# mkdir /web && mkdir /web/sites && mkdir /web/sites/site1.ru && mkdir /web/sites/site1.ru/www && mkdir /web/sites/site1.ru/log && mkdir /web/sites/pma.site1.ru && mkdir /web/sites/pma.site1.ru/www && mkdir /web/sites/pma.site1.ru/log # chown -R nginx:nginx /web
Теперь все готово, можно проверять. Создаем в папке /web/sites/site1.ru/www тестовый файл:
# mcedit /web/sites/site1.ru/www/index.php <?php phpinfo(); ?>
Заходим по адресу: http://site1.ru/ и если наблюдаем информацию о php, то все сделано правильно.
Если нет, то идем в логи и смотрим, в чем ошибка.
Установка phpmyadmin на CentOS 7
Для удобства управления базами веб сайтов я всегда использую phpmyadmin. Установим ее:
# yum install -y phpmyadmin
Копируем файлы панели в наш виртуальный домен, созданный ранее:
# cp -R /usr/share/phpMyAdmin/* /web/sites/pma.site1.ru/www # chown -R nginx:nginx /web/sites/pma.site1.ru/www
Заходим по адресу http://pma.site1.ru/ и проверяем, все ли в порядке.
У меня при первом запуске в браузере открылся просто белый лист. Начал разбираться в чем дело. В логе ошибок nginx этого виртуального хоста увидел ошибку:
*43 FastCGI sent in stderr: "PHP message: PHP Fatal error: Call to undefined function __() in /web/sites/pma.site1.ru/www/libraries/core.lib.php on line 245" while reading response header from upstream, client: 77.47.234.119, server: pma.site1.ru, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php5-fpm.sock:", host: "pma.site1.ru"
Немного погуглил на эту тему и нашел, в чем причина ошибки. Проблема с директорией для файлов сессий. Чтобы исправить ошибку, создаем эту директорию и выставляем на нее нужные права:
# cd /var/lib/php/ # mkdir session # chown nginx:nginx session/
После этого загрузилась панель phpmyadmin:
Более подробную информацию об установке и настройке phpmyadmin смотрите в отдельной статье.
На этом все, настройка nginx + php-fpm на CentOS7 закончена.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Добрый день!
Вы тут в пункте "Настройка nginx и php-fpm на CentOS 7" связали nginx и php-fpm но php 5.4
где можно найти связку nginx и php-fpm 7.1?
нашёл ссылку Вашу https://serveradmin.ru/ustanovka-i-nastroyka-nginx-php-fpm-php7-1-na-centos-7/
там установка nginx и php-fpm 7.1 есть но связки не нашёл(а может только их установка хватит)
В последней ссылке как раз и рассказывается то, что вам нужно. Посмотри еще про centos 8, сейчас имеет смысл ставить именно ее - https://serveradmin.ru/nastrojka-web-servera-nginx-php-fpm-php7-na-centos-8/
Zerox, огромное спасибо за статью!
Сможете подсказать, возможно ли настроить и если возможно, то как это сделать)
Есть сервер mysql на Windows 2012 R2, к нему привязано несколько других сервесов. Необходимо использовать его для работы с Сайтом.
Как это настроить?
Если делать по инструкции, то будет использоваться mariadb, что распологается локально.
Буду признателен, если сможете подсказать и/или направить в нужное русло.
Так ничего делать и не надо. Создайте базу на текущем сервере и подключайтесь к ней удаленно. В больших проектах так чаще всего и бывает, что сервер с базой данных это отдельный сервер.
Здравствуйте. Есть вопрос по настройке файла http://www.conf. Можете подсказать, правильно ли раскомментированы строки параметров:
request_terminate_timeout = 30s
pm.max_requests = 300
и другие. В оригинальном файле они прописаны с - точкой с запятой, например - ;pm.max_requests = 300. Надо ли убирать точку с запятой?
на шаге установки apc возникла ошибка:
[root@mon]# pecl install apc
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: cannot open shared object file: No such file or directory in Unknown on line 0
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading APC-3.1.13.tgz ...
Starting to download APC-3.1.13.tgz (171,591 bytes)
...........................................................
In file included from /var/tmp/APC/apc.c:36:0:
/var/tmp/APC/apc_cache.h: At top level:
/var/tmp/APC/apc_cache.h:136:9: error: unknown type name 'zend_uint'
zend_uint *exec_refcount; /* refcount member of zend_op_array refreshed before execution */
^
/var/tmp/APC/apc.c:47:43: fatal error: ext/standard/php_smart_str.h: No such file or directory
# include "ext/standard/php_smart_str.h"
^
compilation terminated.
make: *** [apc.lo] Error 1
ERROR: `make' failed
не могу понять куда копать.
Сам наткнулся на такую проблему, нашел решение
no ' ' | pecl install -f apcu
Лучше настраивать по более свежей статье - https://serveradmin.ru/ustanovka-i-nastroyka-nginx-php-fpm-php7-1-na-centos-7/
1. Подредактируйте статью, или же выложите ссылки на отредактированный файл, файлы...Отдельный файл настройки Nginx, и отдельные файлы виртуальных хостов.
2. Почему в файле настройки nginx - nginx.conf не указать настройки phpMyAdmin по этой статье https://serveradmin.ru/ustanovit-i-nastroit-phpmyadmin-na-centos-7/
Что мне еще сделать?
После "Приводим конфиг nginx к следующему виду:" и перезапуска nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
Логично было бы посмотреть, что за ошибка в логе.
нужно отключить SELinux и создать каталоги и дать права
# mkdir /web && mkdir /web/sites && mkdir /web/sites/site1.ru && mkdir /web/sites/site1.ru/www && mkdir /web/sites/site1.ru/log && mkdir /web/sites/pma.site1.ru && mkdir /web/sites/pma.site1.ru/www && mkdir /web/sites/pma.site1.ru/log
# chown -R nginx:nginx /web
автор почему-то указывает это в следующих шагах, хотя без них nginx будет ругаться на их отсутствие
1. net-tools - устанавливается только на втором шаге, при установке Maria, а на первом шаге мы проверяем работу NGINX, через netstat, который как раз таки входит в пакет net-tools.
Ну это как бы не главное, но для более полного мануала было бы не плохо.
2. В centOS, в репозиториях заморожены версии пакетов. И даже в последнем centOS 7, MariaDB там старая версия.
Не плохо было бы ставить свежую версию или вообще на выбор. Для этого не хватает в статье про сторонние репы информации.
https://downloads.mariadb.org/mariadb/repositories/#mirror=mephi&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.2
Все проделал, все проверил - но "споткнулся" на установке phpmyadmin.
До этого заметил момент - после редактирования конфига nginx и # systemctl restart nginx.service: вылетает ошибка пока не сделать
# mkdir /web && mkdir /web/sites && mkdir /web/sites/site1.ru && mkdir /web/sites/site1.ru/www && mkdir /web/sites/site1.ru/log && mkdir /web/sites/pma.site1.ru && mkdir /web/sites/pma.site1.ru/www && mkdir /web/sites/pma.site1.ru/log
# chown -R nginx:nginx /web
После всех изменений файлов конфигов, перезапуска сервисов \ сервера - phpmyadmin так и не запустился... вылетает ошибка 500 - по логам (если я те логи смотрел) ничего не видно.
Попробую еще раз с нуля все проделать...
Если запрошенная по IP страница отдаётся, то сервер точно запустился. Строчки ниже можно убрать.
Проверяем, запустился ли:
# netstat -tulpn | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21585/nginx: master
mkdir понимает групповое создание папок:
mkdir {/web,/web/sites,/web/sites/site1.ru,/web/sites/site1.ru/www,/web/sites/site1.ru/log,/web/sites/pma.site1.ru,/web/sites/pma.site1.ru/www,/web/sites/pma.site1.ru/log}
Жесть блин. Я не так много сидел за линухом чувак. Ну вот как мне узнать что для того чтобы всё заработало я должен в /etc/hosts прописать 127.0.0.1 site1.ru ? Чуть до психа не дошел, блин. Но вообще спасибо за статью.
Ээээ, не понял, а при чем тут /etc/hosts и site1.ru? На самом сервере это не обязательно прописывать. Файл hosts надо на клиенте править, чтобы подключиться к тестовому серверу.
Эммм, я не так хорошо пока во всем разбираюсь, но проделав все операции и дойдя до `Заходим по адресу: http://site1.ru/ и если наблюдаем информацию о php, то все сделано правильно.`, у меня вылез левый сайт, а не то что надо. И я начал копать и перепроверять всё по 15 раз каждую строчку, убил весь день на это отловил миллион своих косяков, а оно всё равно не работало пока я про хост не вспомнил))
Тьфу блин, сам в DNS хостинга не указал что у меня такой сайт есть, а как лучше DNS на своем сервере настраивать?
После установки phpmyadmin и копирования все в папки pma.site1.ru(тут следовательно мой домен), ничего не открывается по адресу. Хотя phpinfo работает по адресу site1.ru ... Что-то сделал не так или в какие логи смотреть? (везде ковыряю понять не могу... может порт какой открыть надо в iptables)
После настройки php, netstat -tulpn | grep php-fpm ничего не выдает...
Логи надо смотреть, почему php-fpm не запустился.
А где посмотреть? путь напишите
В этой папке: /var/log/php-fpm
Подскажите, как можно реализовать на Centos работу разных версий php? Интересует 5.6 и 7.0.
Я не знаю, не настраивал никогда.