Задача: Разобрать свои шаги по поднятию связки Nginx + PHP + PHP-FPM + MariaDB увы к сожалению на CentOS 7, хотя я поклонник Ubuntu систем, но вот из-за одного человека на текущем месте работы который уволился приходится все переделывать дабы было легко администрировать, как мои блоги:

У меня настроена максимальная производительность, безопасность, резервное копирование, а не то что сейчас основная ОСь CentOS 7 + сайты в docker которые все в разнобой, нет бекапирование и на десерт никто не знает как это все многообразие работает, и он предыдущий системный администратор уволился в конце года — теперь я поддерживают и оптимизируют этот бардак. Другого слова нет. Почему же CentOS 7, сперва нужно сделать на ней, а после на Ubuntu 18.04 Server все перенесу.

Текущая тестовая система (образ: CentOS-7-x86_64-Minimal-1908.iso) развернутая под гипервизором Debian 10 + Proxmox 6 где характеристики:

  • CPU = 1
  • RAM = 2
  • HDD = 50

Информация по системе:

[ekzorchik@localhost ~]$ uname -a && cat /etc/os-release

Linux localhost.localdomain 3.10.0-1062.9.1.el7.x86_64 #1 SMP Fri Dec 6 15:49:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

NAME="CentOS Linux"

VERSION="7 (Core)"

ID="centos"

ID_LIKE="rhel fedora"

VERSION_ID="7"

PRETTY_NAME="CentOS Linux 7 (Core)"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:centos:centos:7"

HOME_URL="https://www.centos.org/"

BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"

CENTOS_MANTISBT_PROJECT_VERSION="7"

REDHAT_SUPPORT_PRODUCT="centos"

REDHAT_SUPPORT_PRODUCT_VERSION="7"

Шаг №1: Базовые шаги настройки системы перед последующим использованием:

[ekzorchik@localhost ~]$ nano default.sh

#!/bin/bash

sudo yum -y update && sudo yum -y upgrade

sudo yum makecache fast

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

sudo rm -f /etc/localtime

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

sudo yum install -y mc epel-release unzip net-tools psmisc nano bind-utils htop atop lsof wget bzip2 traceroute epel-release yum-utils

sudo systemctl start chronyd && sudo systemctl enable chronyd && sudo systemctl status chronyd | head -n5

sudo systemctl stop firewalld

sudo systemctl disable firewalld

sudo systemctl mask firewalld

sudo firewall-cmd --state

[ekzorchik@localhost ~]$ chmod +x default.sh

[ekzorchik@localhost ~]$ sudo ./default.sh

[ekzorchik@localhost ~]$ ip r | awk '{print $5}' | head -n1

eth0

[ekzorchik@localhost ~]$ sudo nano /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.eth0.disable_ipv6 = 1

[ekzorchik@localhost ~]$ sudo sysctl -p

[ekzorchik@localhost ~]$ sudo localectl set-locale LANG=en_US.UTF_8

[ekzorchik@localhost ~]$ sudo nano /etc/environment

LC_ALL="en_US.UTF-8"

Шаг №2: Устанавливаю Nginx

[ekzorchik@localhost ~]$ sudo yum install -y nginx

[ekzorchik@localhost ~]$ sudo systemctl enable nginx

[ekzorchik@localhost ~]$ sudo systemctl restart nginx

Проверяю, что Web-сервис nginx работает:

[ekzorchik@localhost ~]$ sudo netstat -tulpn | egrep 'nginx'

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15472/nginx: master

tcp6 0 0 :::80 :::* LISTEN 15472/nginx: master

[ekzorchik@localhost ~]$

[ekzorchik@localhost ~]$ hostname -I

172.33.33.20

http://IP&DNS (http://172.33.33.20)

Базовая работа nginx on CentOS 7

Шаг №3: Создаю необходимую структуру сайтов, по сути это как в Ubuntu системе:

[ekzorchik@localhost ~]$ sudo nano /etc/nginx/nginx.conf

Внутри http {…}

Прописываю

include /etc/nginx/sites-enabled/*.conf;

Итого:

user nginx;

worker_processes auto;

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

pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {

worker_connections 1024;

}

http {

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 65;

types_hash_max_size 2048;

server_tokens off;

include /etc/nginx/mime.types;

default_type application/octet-stream;

server {

listen 80 default_server;

server_name _;

root /usr/share/nginx/html;

location / {

}

error_page 404 /404.html;

location = /40x.html {

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

include /etc/nginx/sites-enabled/*.conf;

}

[ekzorchik@localhost ~]$ sudo mkdir /etc/nginx/{sites-available,sites-enabled}

[ekzorchik@localhost ~]$ sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Шаг №4: Устанавливаю php

[ekzorchik@localhost ~]$ sudo yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

[ekzorchik@localhost ~]$ sudo yum-config-manager --disable remi-php54

[ekzorchik@localhost ~]$ sudo yum-config-manager --enable remi-php73

На заметку: Если нужна версия php 7.1 && php 7.2, то:

sudo yum-config-manager --enable remi-php71

sudo yum-config-manager --enable remi-php72

[ekzorchik@localhost ~]$ sudo yum -y install php php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json php-pdo php-pecl-apcu php-pecl-apcu-devel

[ekzorchik@localhost ~]$ php -v

PHP 7.3.16 (cli) (built: Mar 17 2020 10:18:38) ( NTS )

Copyright (c) 1997-2018 The PHP Group

Zend Engine v3.3.16, Copyright (c) 1998-2018 Zend Technologies

Шаг №5: Настраиваю работу PHP:

[ekzorchik@localhost ~]$ sudo rm /etc/php.ini

[ekzorchik@localhost ~]$ sudo nano /etc/php.ini

[PHP]

engine = On

short_open_tag = Off

precision = 14

output_buffering = 4096

zlib.output_compression = Off

implicit_flush = Off

unserialize_callback_func =

serialize_precision = -1

disable_functions =

disable_classes =

zend.enable_gc = On

expose_php = On

max_execution_time = 30

max_input_time = 60

memory_limit = 128M

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

display_errors = Off

display_startup_errors = Off

log_errors = On

log_errors_max_len = 1024

ignore_repeated_errors = Off

ignore_repeated_source = Off

report_memleaks = On

html_errors = On

variables_order = "GPCS"

request_order = "GP"

register_argc_argv = Off

auto_globals_jit = On

post_max_size = 8M

auto_prepend_file =

auto_append_file =

default_mimetype = "text/html"

default_charset = "UTF-8"

doc_root =

user_dir =

enable_dl = Off

cgi.fix_pathinfo=0

file_uploads = On

upload_max_filesize = 2M

max_file_uploads = 20

allow_url_fopen = On

allow_url_include = Off

default_socket_timeout = 60

[CLI Server]

cli_server.color = On

[Date]

[filter]

[iconv]

[imap]

[intl]

[sqlite3]

[Pcre]

pcre.jit=0

[Pdo]

[Pdo_mysql]

pdo_mysql.default_socket=

[Phar]

[mail function]

sendmail_path = /usr/sbin/sendmail -t -i

mail.add_x_header = Off

[ODBC]

odbc.allow_persistent = On

odbc.check_persistent = On

odbc.max_persistent = -1

odbc.max_links = -1

odbc.defaultlrl = 4096

odbc.defaultbinmode = 1

[Interbase]

ibase.allow_persistent = 1

ibase.max_persistent = -1

ibase.max_links = -1

ibase.timestampformat = "%Y-%m-%d %H:%M:%S"

ibase.dateformat = "%Y-%m-%d"

ibase.timeformat = "%H:%M:%S"

[MySQLi]

mysqli.max_persistent = -1

mysqli.allow_persistent = On

mysqli.max_links = -1

mysqli.default_port = 3306

mysqli.default_socket =

mysqli.default_host =

mysqli.default_user =

mysqli.default_pw =

mysqli.reconnect = Off

[mysqlnd]

mysqlnd.collect_statistics = On

mysqlnd.collect_memory_statistics = Off

[PostgreSQL]

pgsql.allow_persistent = On

pgsql.auto_reset_persistent = Off

pgsql.max_persistent = -1

pgsql.max_links = -1

pgsql.ignore_notice = 0

pgsql.log_notice = 0

[bcmath]

bcmath.scale = 0

[browscap]

[Session]

session.save_handler = files

session.use_strict_mode = 0

session.use_cookies = 1

session.use_only_cookies = 1

session.name = PHPSESSID

session.auto_start = 0

session.cookie_lifetime = 0

session.cookie_path = /

session.cookie_domain =

session.cookie_httponly =

session.cookie_samesite =

session.serialize_handler = php

session.gc_probability = 1

session.gc_divisor = 1000

session.gc_maxlifetime = 1440

session.referer_check =

session.cache_limiter = nocache

session.cache_expire = 180

session.use_trans_sid = 0

session.sid_length = 26

session.trans_sid_tags = "a=href,area=href,frame=src,form="

session.sid_bits_per_character = 5

[Assertion]

zend.assertions = -1

[mbstring]

[gd]

[exif]

[Tidy]

tidy.clean_output = Off

[soap]

soap.wsdl_cache_enabled=1

soap.wsdl_cache_dir="/tmp"

soap.wsdl_cache_ttl=86400

soap.wsdl_cache_limit = 5

[sysvshm]

[ldap]

ldap.max_links = -1

[dba]

[curl]

[openssl]

[ekzorchik@localhost ~]$ sudo nano /etc/php-fpm.d/www.conf

[www]

user = nginx

group = nginx

;listen = 0.0.0.0:9000

listen = 127.0.0.1:9000

;listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx

listen.group = nginx

listen.allowed_clients = 127.0.0.1

pm = dynamic

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 5

pm.max_spare_servers = 35

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_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache

[ekzorchik@localhost ~]$ sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

[ekzorchik@localhost ~]$ sudo rm /etc/php-fpm.d/www.conf

[ekzorchik@localhost ~]$ sudo nano /etc/php-fpm.d/www.conf

[www]

user = nginx

group = nginx

listen = 127.0.0.1:9000

listen.owner = nginx

listen.group = nginx

listen.allowed_clients = 127.0.0.1

pm = dynamic

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 5

pm.max_spare_servers = 35

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_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache

[ekzorchik@localhost ~]$ sudo systemctl enable php-fpm

Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

[ekzorchik@localhost ~]$ sudo systemctl start php-fpm

Шаг №6: Создаю скрипт который служит проверкой, что Nginx + php-fpm отрабатывает выполнение скриптов php:

[ekzorchik@localhost ~]$ sudo nano /usr/share/nginx/html/info.php

<?php phpinfo(); ?>;

[ekzorchik@localhost ~]$ sudo chown -R nginx:nginx /usr/share/nginx/html/

[ekzorchik@localhost ~]$ sudo chmod -R 755 /usr/share/nginx/html/

Шаг №7: Создаю конфигурационный файл сайта:

[ekzorchik@localhost ~]$ sudo nano /etc/nginx/sites-available/example.conf

server {

listen 80;

server_name 172.33.33.20;

set $root_path '/usr/share/nginx/html';

root $root_path;

index index.php;

location / {

try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;

}

error_page 500 502 503 504 /50x.html;

error_page 404 /404.php;

location = /50x.html {root /usr/share/nginx/html;}

#location = /404.php {root $root_path;}

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;

include fastcgi_params;

fastcgi_intercept_errors on;

}

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

}

[ekzorchik@localhost ~]$ sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.conf

[ekzorchik@localhost ~]$ sudo systemctl restart nginx php-fpm.service

Шаг №8: Проверяю, посредством браузера что скрипт отрабатывает путем обращения на URL: http://IP&DNS/info.php (http://172.33.33.20/info.php)

И скрипт выполнился

Nginx + PHP-FPM работает info.php

Отлично.

Шаг №9: Устанавливаю сервис базы данных:

[ekzorchik@localhost ~]$ sudo nano /etc/yum.repos.d/mariadb.repo

[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/10.3/centos73-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

[ekzorchik@localhost ~]$ sudo yum makecache fast

[ekzorchik@localhost ~]$ sudo yum install -y MariaDB-server MariaDB-client

[ekzorchik@localhost ~]$ rpm -qa | grep MariaDB

MariaDB-common-10.3.22-1.el7.centos.x86_64

MariaDB-server-10.3.22-1.el7.centos.x86_64

MariaDB-compat-10.3.22-1.el7.centos.x86_64

MariaDB-client-10.3.22-1.el7.centos.x86_64

[ekzorchik@localhost ~]$

[ekzorchik@localhost ~]$ mysql -V

mysql Ver 15.1 Distrib 10.3.22-MariaDB, for Linux (x86_64) using readline 5.1

[ekzorchik@localhost ~]$ sudo systemctl enable mariadb

Created symlink from /etc/systemd/system/mysql.service to /usr/lib/systemd/system/mariadb.service.

Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mariadb.service.

Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

[ekzorchik@localhost ~]$ sudo systemctl start mariadb

[ekzorchik@localhost ~]$ sudo mysqladmin -u root password 712mbddr@

[ekzorchik@localhost ~]$ sudo mysql_secure_installation

Enter current password for root (enter for none): 712mbddr@

Change the root password? [Y/n] n

Remove anonymous users? [Y/n] y

Disallow root login remotely? [Y/n] y

Remove test database and access to it? [Y/n] y

Reload privilege tables now? [Y/n] y

[ekzorchik@localhost ~]$ sudo mysql -u root -p712mbddr@ -e "show databases"

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

+-----------------a---+

[ekzorchik@localhost ~]$

Отлично:

Итого, я получил свою собственную проработанную структуру Linux Nginx PHP-FPM Mariadb.

На этом пока все, с уважением автор блога Олло Александр aka ekzorchik.