Centos 7 + nginx + php

Добрый день, уважаемые читатели. Сегодня я расскажу, как я поднимал web server на Centos 7.

Дано:
Сервер Centos 7.
Статический ip, присвоенный этому серверу.
Два домена с возможностью их использования.
Настроенный ssh сервер.

Задание:
Настроить web-server.
Настроить работу web-server с php-fpm
Сделать отдельную интернет страничку для php-fpm.

Итак, подключимся к нашему серверу по ssh (mRemoteng), используя. настройки данные нам администратором виртуальной машины.

Общая настройка системы

yum install nano

Установлю редактор текста nano.

yum install mc

Так-же midnight commander

yum install net-tools

пакет, net-tools, позволит использовать привычные команды Linux (ifconfig и etc)

yum update

Обновляем Centos

yum install epel-release

EPEL (Extra Packages for Enterprise Linux) — это основанный сообществом открытый и бесплатный проект репозитория предоставляемый командой Fedora, который содержит высококачественные пакеты дополнительного программного обеспечения для Linux дистрибутивов.

Установим репозиторий EPEL, который понадобиться нам для установки php.

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

yum repolist

Вывод команды будет примерно таким.

Теперь проверим включен ли у нас SELinux

sestatus

Если видим статус «enabled», переходим в конфигурационный файл SELinux и изменяем значение.

nano /etc/sysconfig/selinux

в файле установите значение disabled. Закройте редактор, сохранив изменения.

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

setenforce 0

А теперь установим утилиту для сканирования сети и открытых портов.

yum install nmap

Синтаксис использования для просмотра открытых портов:

nmap -sT -O localhost

или

netstat -nlp

или

iptables-save

В конце информационной строки увидим открытые порты.
Теперь нам нужно открыть порты в «firewallD» для будущих сервисов:

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

Стоит отметить, что на моем сервере установлен iptables.
А надстройка над ним используется firewallD. (управление)
Поясним команды выше:
Команда firewall-cmd — это управление файрволлом.
Команда —permanent — используется для постоянной настройки параметров, т.е навсегда. Изменения вступят в силу после перезагрузки firewall.
Командой —add-port — указываем какой порт нужно открыть.

Теперь можно повторно перепроверить, какие порты открыты.

Установка NGINX

yum install nginx

Этой командой установим nginx. Необходимые пакеты уже есть в системе. Если вы хотите установить самую свежую версию nginx, можно воспользоваться официальным мануалом.

nano /etc/nginx/nginx.conf

Внесем изменения в основной конфигурационный файл nginx:

http {

    ...

    server_names_hash_bucket_size 64;

 ....}

Вставим настройку сразу перед началом блока server. Это нужно для фикса возможной ошибки: could not build server_names_hash, you should increase server_names_hash_bucket_size: 32.

systemctl enable nginx

Включим автозапуск nginx

systemctl start nginx

Запустим nginx
Теперь, можно проверить запустился ли nginx. Введите ip адрес вашего сервера в строку браузера. Там должно быть приветственное сообщение nginx.

Установка PHP и PHP-FPM

yum install php

Команда установки php

yum install php-fpm

Команда установки php-fpm

systemctl start php-fpm

Стартуем php-fpm

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

ps -ax | grep nginx 
ps -ax | grep php-fpm

А теперь добавим php-fpm в автозапуск:

systemctl enable php-fpm

Настройка связки NGINX + PHP

Теперь, когда базовые программы установлены, сделаем страничку для вывода информации о php.
Задача: прикрутить к страничке один из доменов, выданных нам администратором.

О том, что значит каждая строка в основном конфиге сервера nginx, я постараюсь поговорить в следующих выпусках моего шоу.
А пока представлю вашему вниманию уже отредактированный конфиг nginx.conf. Я вырезал из конфига блок server.
Дам пояснения для выделенных жирным шрифтом строк.

# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
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;

server_names_hash_bucket_size 64;

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

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

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;


# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

}

Эта строка означает, что основной конфиг nginx «смотрит» на наличие других конфигурационных файлов в директории /etc/nginx/conf.d/*.conf

Это дает нам некоторое удобство использования.
В основном конфиге есть разные опции, которые будут действовать для всех виртуальных доменов. Однако в ряде случаев нам не нужно, чтобы некоторые опции были включены для всех сайтов, которые «крутятся» на нашем основном сервере. В связи с этим, в конфигурационных файлах этой директории мы можем задать уникальные настройки для каждого нашего сайта, которые будут справедливы лишь для него.
А так же, так будет удобнее администрировать наши сайты. В той папке можно будет расположить все файлы которые относятся к сайту, включая конфиги, саму страницу сайта, картинки котиков и etc.

Как уже было сказано, я вырезал блок server и вставил его в новом конфигурационном файле.

Для начала создадим новый конфигурационный файл нашего сайта в директории /conf.d

cp /etc/nginx/nginx.conf /etc/nginx/conf.d/nameofyourdomain.conf

Я скопировал конфигурациионный файл и привел его к виду:

[root@x-conf ~]# cat /etc/nginx/conf.d/nameofyourdomain.conf
server {
listen 80;
server_name nameofyourdomain.ru nameofyourdomain.ru;
root /usr/share/nginx/html/nameofyourdomain.ru;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
index index.php;
}

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

А теперь пробежимся по выделенному жирным шрифтом.

cat /etc/nginx/conf.d/nameofyourdomain.conf — я вывел командой cat синтаксис конфига нашей тестовой php странички.

server_name nameofyourdomain.ru nameofyourdomain.ru; — доменные имена, при обращении к которым сервер будет отдавать ответ с информацией о версии php

root /usr/share/nginx/html/nameofyourdomain.ru; — директория, в которой хранится файл index.php

location / { index index.php; } — указываем, какой файл нужно читать и впоследствии отдавать его на запрос.

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } — настройки php для связи с nginx. Взяты из nginx.conf.default, — который, в свою очередь, находился в папке /etc/nginx

Приводим ваш конфиг к этому виду.

А теперь финальный штрих. Создадим директорию:
/usr/share/nginx/html/nameofyourdomain.ru,
а в ней создадим файл index.php
А уже в файле index.php пропишем скрипт:

<?php phpinfo(); ?>

А теперь осталось лишь перезагрузить nginx.

nginx -s reload

Проверяем доступность:
Вводим наш ip адрес в браузере. Сервер должен отдать обычную приветственную страничку nginx
А если ввести наш домен, nginx ответит страничкой с текущими настройками php.
Пока на этом все.
Спасибо, что вы с нами.