Разное

Php server: PHP: Встроенный веб-сервер — Manual

09.07.2021

Содержание

PHP: встроенный web-сервер — CMScafe

Введение

Мало кто знает, но начиная с версии PHP 5.4 этот язык программирования имеет встроенный web-сервер. В этой статье мы рассмотрим его запуск и использование в ОС Windows.

Если у вас не настроен обработчик PHP в системе:

  1. Скачиваем с официального сайта нужную нам версию: http://windows.php.net/download/
  2. Распаковываем в удобную директорию (у меня это D:\PHP)
  3. Кликаем на кнопке «мой компьютер» правой кнопкой мыши – выбираем «свойства» — «дополнительные параметры системы» — «дополнительно» — «переменные среды» — переменная «path»
  4. В значениях этой переменной перечислены пути разделенные ; — добавляем путь к папке с нашим PHP.
  5. Поздравляю! Теперь в вашей командной строке windows доступна команда php.

Запуск и настройка сервера

Теперь пришло время запустить сервер. Для этого откроем терминал и перейдем в папку с сайтом.

После чего вызовем команду

php -S localhost:80

либо можно использовать такую команду:

php -S localhost:80 -t D:\Path\To\Site

В данном примере флаг -t используется для указания пути к папке с исполняемыми скриптами PHP.

Вместо пути к папке – можно указать путь к исполняемому php файлу. Такой файл будет являться маршрутизатором приложения. Причем если скрипт возвращает false – то запрашиваем url будет обрабатываться сервером или вернет 404 ошибку, иначе, если скрипт возвращает что-то еще, то он передается клиенту.

флаг -S указывает на то, что нужно запустить php сервер по адресу

localhost на 80 порте.

Вместо localhost можно также указать любой IP адрес по которому будет доступен сайт. Это особенно удобно, если вы используете локальную сеть.

Если вместо IP указать 0.0.0.0 – то сервер будет доступен на любом интерфейсе машине.

Иногда приложению необходимо указать специфичные настройки php. ini. Для этого предусмотрен флаг -c, позволяющий явно указать путь к такому файлу настроек.

php -S localhost:80 -c path/to/php.ini

Хорошим примером, в таких случаях, является хранить php.ini в корневой директории вашего приложения. Это может облегчить доступ к настройкам для других разработчиков, если вы работаете в команде и используете общий (сетевой) доступ к приложению. Также это позволяет выгружать файл настроек в систему контроля версий.

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

php -S localhost:80 router.php

Сценарий маршрутизации будет запускаться перед каждым HTTP-запросом.

Стоит подметить, что после запуска сервера каждый HTTP запрос отображается в терминале. Благодаря этому можно, например, заметить когда сайт вернет 400 или 500 ошибку.

Вообще терминал при включенном web-сервере выполняют функцию онлайн-мониторинга состояний приложения.

Михаил Мозгов

Привет! Меня зовут Михаил. В 2007 году познакомился с Joomla! на уровне использования готовых решений + HTML и CSS. С 2012 года начал изучать PHP + SQL и JS. В 2013-2014 годах открыл для себя сайт CMSCafe. Здесь я почерпнул много интересного и познавательного материала, за что отдельное спасибо Евгению и Дмитрию. В настоящее время работаю начальником IT отдела в компании Tutmee Int.

Web, PHP и Apache OTUS

Начиная с версии 5.4.0, язык программирования PHP содержит встроенный веб-сервер (server), который находится в модуле CLI SAPI. В этой статье мы поговорим, как он работает, настраивается и запускается. Отдельное внимание уделим известному web-серверу Apache.

В языке программирования PHP сервер (_server) выполняет лишь один однопоточный процесс, поэтому если запрос будет заблокирован, программные приложения остановятся, причем запросы URL обслуживаются из текущей директории, где он был запущен (когда не используется опция -t, обеспечивающая явное указание корневого документа).

Если URL запроса не указывает на конкретный файл, в указанной директории вернется index.php или index.html. Если же файлы не существуют, их поиск продолжится в родительской директории и т. д., причем до тех пор, пока файлы не будут обнаружены либо не будет достигнут корень документа. Когда обнаружен index.php/index.html, он возвращается, причем в $_SERVER[‘PATH_INFO’] будет последняя часть URL. В обратном случае вернется код 404.

Если в процессе запуска web сервера файл PHP указывается в командной строке, он рассматривается в качестве скрипта «маршрутизации» (как роутер). Этот скрипт выполняется лишь в начале каждого запроса HTTP. Если же скрипт возвращает 

false, тогда запрашиваемый ресурс возвращается как есть. В обратном случае браузеру вернется вывод скрипта.

Разработчик может настроить встроенный PHP web server таким образом, чтобы он осуществлял разветвление нескольких воркеров в целях проверки кода, требующего нескольких одновременных запросов ко встроенному веб серверу. Для этого, начиная с версии 7.4.0, надо задавать в переменной окружения число требуемых воркеров, делая это перед запуском:

Данная функция является экспериментальной. Она не поддерживается в операционной системе Windows и не предназначена для использования в production. Да и вообще, встроенный web_server обычно не предназначен для того, чтобы использовать его в production.

Запуск PHP-сервера

Запуск осуществляется следующим образом:

$ cd ~/public_html

$ php -S localhost:8000

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

Listening on localhost:8000

Document root is /home/me/public_html

Press Ctrl-C to quit

После этого пишем URL-запрос:

— http://localhost:8000/;

— http://localhost:8000/myscript.html.

По итогу в консоли будет выведено примерно следующее:

Можно отметить, что до версии 7. 4.0 статические ресурсы с символическими ссылками в операционной системе «Виндовс» доступны не были.

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

$ cd ~/public_html

$ php -S localhost:8000 -t foo/

Вывод в консоли:

В примере ниже используется скрипт маршрутизации. Запросы изображений будут их отображать, однако запросы файлов HTML вернут строку «Добро пожаловать».

Обратите внимание, что встроенный web _server не должен применяться в общедоступной сети.

CLI _server: проверка использования

Чтобы обеспечить совместное использование скрипта маршрутизации при разработке с CLI _server и далее с рабочим (production) web-сервером, применяют следующую команду:

Поддержка неподдерживаемых файловых типов

Если требуется обслуживание статических ресурсов с MIME-типами, не поддерживаемыми web CLI _server, пригодится следующий код:

$ php -S localhost:8000 router. php

Local host — так называемый локальный («местный») хост, то есть компьютер, на котором запускается программа (ПК в данном случае работает как Virtual _server).

Доступ с удаленных машин

Также у разработчика есть возможность сделать сервер на PHP доступным для всех сетевых интерфейсов на 8000 порту:

Apache HTTP _Server

Apache («Апач») — известный HTTP-сервер, имя которого заимствовано от названия племени североамериканских индейцев. Это кроссплатформенное программное обеспечение, поддерживаемое многими операционными системами:

— Linux,

— Windows,

— BSD,

— Mac OS,

— Novell NetWare,

— BeOS.

Широко известна связка Apache + PHP + MySQL.

Основные достоинства «Апача» — гибкость конфигурации и надежность. С его помощью можно подключать для предоставления данных внешние модули, применять для аутентификации пользователей СУБД, модифицировать сообщения об ошибках и многое другое.

Также Apache-серверы (servers) поддерживает протокол IPv4.

Одно из преимуществ — интеграция с другим программным обеспечением и языками программирования. Есть много модулей, обеспечивающих веб-серверу Apache поддержку разных систем разработки и языков программирования. Что реализуют в модулях:

— поддержку языков программирования;

— исправление ошибок;

— добавление новых функций;

— возможность модификации основных фукнций;

— средства усиления безопасности.

Раз уж затронули тему безопасности, то тут «Апач» имеет разные механизмы, включая механизм разграничения доступа к данным. Основное:

— ограничение доступа к некоторым файлам/каталогам;

— механизм авторизации пользователей, обеспечивающий доступ к каталогу на основании HTTP- и digest-аутентификации;

— ограничение доступа к конкретным каталогам либо всему серверу, которое основано на IP-адресах пользователей;

— запрет доступа к файлам по их типу, что можно распространить как на всех пользователей, так и на некоторую их часть, к примеру, организовав запрет доступа к файлам конфигурации/базы данных.

Некоторые модули позволяют реализовывать авторизацию с помощью СУБД либо PAM.

Вдобавок ко всему, «Апачу» не проблема поддерживать механизмы CGI и FastCGI, позволяющие исполнять программы почти на любых языках программирования, включая C/C++, Lua, Java.

Если вас интересует установка и настройка Apache, обратите внимание на дополнительные ссылки ниже, где вы найдете нужную информацию.

Данная статья про server PHP написана на основании следующих материалов:

  • Page № 1: https://www.php.net/manual/ru/features.commandline.webserver.php;
  • Page № 2: https://www.php.net/manual/ru/install.unix.apache2.php.

Хотите знать больше и получить самую современную информацию? Обратите внимание на соответствующий курс в Otus:

Как использовать встроенные веб-серверы PHP — Symfony Framework Documentation documentation

С выхода PHP 5.4, CLI SAPI поставляется со встроенным веб-сервером. Он может быть использован для запуска ваших PHP-приложений локально во время разработки, для тестирования или для демонстрации приложения. Таким образом, вам не нужно заморачиваться конфигурацией полномасштабного веб-сервера такого, как Apache или Nginx.

Caution

Встроенный веб-сервер должен быть запущен только в контролируемом окружении. Он не создан для использования в публичных сетях.

Запуск веб-сервера

Запустить приложение Symfony с использованием встроенного веб-сервера PHP так же легко, как выполнить команду server:start:

$ php bin/console server:start

Это запускает веб-сервер в localhost:8000 в фоновом режиме, который обслуживает ваше приложение Symfony.

По умолчанию, веб-сервер слушает порт 8000 на закольцованном устройстве. Вы можете изменить канал, передающий IP-адрес и порт, в качестве аргумента командной строки:

$ php bin/console server:start 192. 168.0.1:8080

Note

Теперь вы можете использовать команду server:status, чтобы проверить, слушает ли веб-сервер определённый канал:

$ php bin/console server:status

$ php bin/console server:status 192.168.0.1:8080

Первая команда показывает вам, будет ли ваше приложение Symfony использовать сервер чере localhost:8000, а вторая делает то же самое для 192.168.0.1:8080.

Tip

Некоторые системы не поддерживают команду server:start, в этих случаях вы можете выполнить команду server:run. Эта команда ведёт себя немного по-другому. Вместо запуска сервера в фоновом режиме, она заблокирует текущий терминал до того, как вы её прервёте (это делается путём нажатия Ctrl и C).

Опции команды

Встроенный веб-сервер ожидает скрипт «маршрутизатора» (прочитайте про скрипт «маршрутизатора» на php.net) в качестве аргумента. Symfony уже передаёт такой скрипт, когда команда выполняетя в окружени prod или dev. Используйте опцию --router в любом другом окружении, или используйте другой скрипт маршрутизатора:

$ php bin/console server:start --env=test --router=app/config/router_test.php

Если корневой документ вашего приложения отличается от стандартного макета каталога, вам нужно передать правильную локацию, используя опцию --docroot:

$ php bin/console server:start --docroot=public_html

Остановка сервера

Когда вы закончили, вы можете просто остановить веб-сервер, используя команду server:stop:

$ php bin/console server:stop

Как и с командой запуска, если вы опустите информацию о канале, Symfony остановит сервер, привязанный к localhost:8000. Просто передайте информацию о канале, когда веб-сервер слушает другой IP-адрес или другой порт:

$ php bin/console server:stop 192.168.0.1:8080

Как nginx обрабатывает запросы

Как nginx обрабатывает запросы

Определение виртуального сервера по имени

nginx вначале решает, какой из серверов должен обработать запрос. Рассмотрим простую конфигурацию, где все три виртуальных сервера слушают на порту *:80:

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

В этой конфигурации, чтобы определить, какому серверу следует направить запрос, nginx проверяет только поле “Host” заголовка запроса. Если его значение не соответствует ни одному из имён серверов или в заголовке запроса нет этого поля вовсе, nginx направит запрос в сервер по умолчанию для этого порта. В вышеприведённой конфигурации сервером по умолчанию будет первый сервер, что соответствует стандартному поведению nginx по умолчанию. Сервер по умолчанию можно задать явно с помощью параметра default_server в директиве listen:

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}
Параметр default_server появился в версии 0.8.21. В более ранних версиях вместо него следует использовать параметр default.

Следует иметь в виду, что сервер по умолчанию является свойством слушающего порта, а не имени сервера. Подробнее это обсуждается ниже.

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

Если запросы без поля “Host” в заголовке не должны обрабатываться, можно определить сервер, который будет их отклонять:

server {
    listen      80;
    server_name "";
    return      444;
}

Здесь в качестве имени сервера указана пустая строка, которая соответствует запросам без поля “Host” в заголовке, и возвращается специальный для nginx код 444, который закрывает соединение.

Начиная с версии 0.8.48 настройка server_name "" является стандартной и может явно не указываться. В более ранних версиях в качестве стандартного имени сервера выступало имя машины (hostname).
Определение виртуального сервера по имени и IP-адресу

Рассмотрим более сложную конфигурацию, в которой некоторые виртуальные серверы слушают на разных адресах:

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

В этой конфигурации nginx вначале сопоставляет IP-адрес и порт запроса с директивами listen в блоках server. Затем он сопоставляет значение поля “Host” заголовка запроса с директивами server_name в блоках server, которые соответствуют IP-адресу и порту. Если имя сервера не найдено, запрос будет обработан в сервере по умолчанию. Например, запрос www.example.com, пришедший на порт 192.168.1.1:80, будет обработан сервером по умолчанию для порта 192.168.1.1:80, т.е. первым сервером, т.к. для этого порта www.example.com не указан в списке имён серверов.

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

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80 default_server;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80 default_server;
    server_name example.com www.example.com;
    ...
}
Конфигурация простого сайта PHP

Теперь посмотрим на то, как nginx выбирает location для обработки запроса на примере обычного простого PHP-сайта:

server {
    listen      80;
    server_name example. org www.example.org;
    root        /data/www;

    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

nginx вначале ищет среди всех префиксных location’ов, заданных строками, максимально совпадающий. В вышеприведённой конфигурации указан только один префиксный location “/”, и поскольку он подходит под любой запрос, он и будет использован, если других совпадений не будет найдено. Затем nginx проверяет location’ы, заданные регулярными выражениями, в порядке их следования в конфигурационном файле. При первом же совпадении поиск прекращается и nginx использует совпавший location. Если запросу не соответствует ни одно из регулярных выражений, nginx использует максимально совпавший префиксный location, найденный ранее.

Следует иметь в виду, что location’ы всех типов сопоставляются только с URI-частью строки запроса без аргументов. Так делается потому, что аргументы в строке запроса могут быть заданы различными способами, например:

/index.php?user=john&page=1
/index.php?page=1&user=john

Кроме того, в строке запроса можно запросить что угодно:

/index.php?page=1&something+else&user=john

Теперь посмотрим, как бы обрабатывались запросы в вышеприведённой конфигурации:

  • Запросу “/logo.gif” во-первых соответствует префиксный location “/”, а во-вторых — регулярное выражение “\.(gif|jpg|png)$”, поэтому он обрабатывается location’ом регулярного выражения. Согласно директиве “root /data/www” запрос отображается в файл /data/www/logo.gif, который и посылается клиенту.
  • Запросу “/index.php” также во-первых соответствует префиксный location “/”, а во-вторых — регулярное выражение “\. (php)$”. Следовательно, он обрабатывается location’ом регулярного выражения и запрос передаётся FastCGI-серверу, слушающему на localhost:9000. Директива fastcgi_param устанавливает FastCGI-параметр SCRIPT_FILENAME в “/data/www/index.php”, и сервер FastCGI выполняет указанный файл. Переменная $document_root равна значению директивы root, а переменная $fastcgi_script_name равна URI запроса, т.е. “/index.php”.
  • Запросу “/about.html” соответствует только префиксный location “/”, поэтому запрос обрабатывается в нём. Согласно директиве “root /data/www” запрос отображается в файл /data/www/about.html, который и посылается клиенту.
  • Обработка запроса “/” более сложная. Ему соответствует только префиксный location “/”, поэтому запрос обрабатывается в нём. Затем директива index проверяет существование индексных файлов согласно своих параметров и директиве “root /data/www”. Если файл /data/www/index.html не существует, а файл /data/www/index.php существует, то директива делает внутреннее перенаправление на “/index.php” и nginx снова сопоставляет его с location’ами, как если бы такой запрос был послан клиентом. Как мы видели ранее, перенаправленный запрос будет в конечном итоге обработан сервером FastCGI.
автор: Игорь Сысоев
редактор: Brian Mercer

Поднимаем веб‑сервер на macOS

Статья утратила свою актуальность и предлагается только для ознакомительных целей.

Веб-разработка начинается с настройки локального веб-сервера. Есть множество различных комбинаций устанавливаемых пакетов и сборок, которые удобны по-своему. В этой статье я расскажу об установке связки Apache + PHP + MySQL + Redis + Memcached на macOS.

Установка Homebrew

Управлением пакетов, которые не идут в комплекте с macOS, занимается утилита Homebrew.

На официальном сайте вы найдете команду для запуска установки.

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Следуйте указаниям и введите пароль администратора, когда потребуется. В результате выполнения команды будет установлен Homebrew и XCode Command Line Tools.

Чтобы убедиться, что установка прошла успешно, выполните команду “brew —version”.

$ brew --version Homebrew 1.1.4 Homebrew/homebrew-core (git revision 4a1f; last commit 2016-12-15)

Подключаем репозитории с необходимыми пакетами.

$ brew tap homebrew/php $ brew tap homebrew/apache

И выполняем обновление всех репозиториев, подключенных к brew.

$ brew update

Всё готово к установке пакетов.

Установка Apache

С помощью Homebrew установим Apache со всеми необходимыми скриптами.

Перед установкой следует отключить и убрать из автозагрузки встроенный Apache-сервер.

$ sudo apachectl stop $ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null $ brew install httpd24 --with-privileged-ports --with-http2

Операция займет время. Ожидайте появления строки, которая подтвердит успех установки.

/usr/local/Cellar/httpd24/2.4.23_2: 212 files, 4.4M, built in 1 minute 45 seconds

Обратите внимание на этот путь “/usr/local/Cellar/httpd24/2.4.23_2”. Он сейчас понадобится для настройки автозапуска Apache.

Задаем права и включаем автозагрузку свежеустановленного сервера.

$ sudo cp -v /usr/local/Cellar/httpd24/2.4.23_2/homebrew.mxcl.httpd24.plist /Library/LaunchDaemons $ sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist $ sudo chmod -v 644 /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist $ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

Перейдите по адресу http://localhost/.

Apache успешно установлен

Решения возможных проблем

Если вы получаете сообщение, что браузер не может подключиться к серверу, первым делом проверьте, запущен ли сервер.

$ ps -aef | grep httpd

Вы должны увидеть несколько httpd процессов, если Apache запущен.

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

$ sudo apachectl -k restart

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

$ tail -f /usr/local/var/log/apache2/error_log

Если проблема не пропала, убедитесь, что в файле /usr/local/etc/apache2/2.4/httpd.conf имеется следующая строчка.

Listen: 80

Apache контролируется с помощью apachectl. Следующие команды могут быть полезны.

$ sudo apachectl start $ sudo apachectl stop $ sudo apachectl -k restart

Настрока Apache

У вас есть установленный веб-сервер. Пора настроить его.

Первым делом мы изменим директорию для хранения сайтов. Откройте для редактирования конфигурационный файл Apache.

$ open -e /usr/local/etc/apache2/2.4/httpd.conf

Найдите строку, где задается параметр DocumentRoot.

DocumentRoot "/usr/local/var/www/htdocs"

И измените её на следующую, где your_user — имя вашего аккаунта.

DocumentRoot /Users/your_user/Sites

Также надо изменить тег , чтобы его параметр совпадал с DocumentRoot.

Обратите внимание, что кавычки отсутствуют. Стандартный редактор автоматически может заменить их на другие символы, что может стать причиной ошибки.

Если вы планируете в локальных проектах использовать файл дополнительной конфигурации сервера .htaccess, то обратите внимание на настройки AllowOverride и mod_rewrite.

В блоке найдите опцию AllowOverride, которая отвечает за возможность использования .htaccess, и измените её на следующую.

# AllowOverride controls what directives may be placed in . htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride All

Для возможности преобразования URL потребуется модуль mod_rewrite, который по-умолчанию закомментирован. Найдите строку и уберите символ комментирования #.

#LoadModule rewrite_module libexec/mod_rewrite.so

LoadModule rewrite_module libexec/mod_rewrite.so

Пользователи и группы

Мы направили обращения Apache к сайтам в директорию Sites, которую поместили в домашнем каталоге. Обычно Apache работает от имени системного пользователя daemon группы daemon, из-за этого могут возникнуть некоторые проблемы с доступом. Необходимо задать, пользователя и группу, от чьего имени Apache будет работать.

В конфигурационном файле Apache найдите User и Group и измените на следующее. your_user — имя вашего аккаунта.

User your_user Group staff

Директория для локальных сайтов

Создайте папку для сайтов в домашнем каталоге.

$ mkdir ~/Sites

Следующая команда создаст в папке Sites файл index.html и поместит в нем код первой веб-страницы.

$ echo "My User Web Root" > ~/Sites/index.html

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

$ sudo apachectl -k restart

Снова откройте в браузере страницу по адресу http://localhost/.

Установка PHP

На этом шаге мы установим PHP 5.6 и PHP 7.0, а также настроим скрипт переключения между версиями PHP.

Выполните установку необходимых версий PHP с помощью следующих команд.

$ brew install php70 --with-apache $ brew unlink php70 $ brew install php56 --with-apache

Если потребуется, вы можете настроить каждую версию языка в соответствующих php.ini.

/usr/local/etc/php/5.6/php.ini /usr/local/etc/php/7.0/php.ini

Знакомим Apache и PHP

Вы успешно установили нужные версии PHP, но теперь нужно сказать Apache использовать их.

Снова откройте файл /usr/local/etc/apache2/2.4/httpd.conf и найдите строку

#LoadModule php5_module

Вместо нее добавьте следующие строки для подключения ваших версий PHP.

LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5. so #LoadModule php7_module /usr/local/opt/php70/libexec/apache2/libphp7.so

Оставим незакомментированным php5_module, чтобы использовать его сейчас. Скрипт для переключения между версиями добавим немного позже.

Найдите ниже настройку указания на корневой файл директории.

DirectoryIndex index.html

И замените её следующими настройками.

DirectoryIndex index.php index.html SetHandler application/x-httpd-php

Сохраните файл настроек и снова перезагрузите сервер.

$ sudo apachectl restart

Проверяем установку PHP

Создайте в директории с сайтами файл index.php с содержанием “

$ echo " ~/Sites/index. php

Откройте в браузере страницу по адресу http://localhost/. Вы увидите информацию о настройках PHP.

Переключение версий PHP

Установим небольшой sphp скрипт в стандартную для brew директорию /usr/local/bin.

$ curl -L https://gist.github.com/w00fz/142b6b19750ea6979137b963df959d11/raw > /usr/local/bin/sphp $ chmod +x /usr/local/bin/sphp

Homebrew при установке должен был добавить свои директории /usr/local/bin и /usr/local/sbin в переменную $PATH. Убедимся в этом.

$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Если вышеуказанные директории отсутствуют в результат выполнения команды у вас, то выполните следующую команду, которая исправит это.

$ export PATH=/usr/local/bin:/usr/local/sbin:$PATH

Остановите и запустите Apache. Не перезагружайте.

$ sudo apachectl -k stop $ sudo apachectl start

Снова откройте файл настроек Apache /usr/local/etc/apache2/2.4/httpd.conf и замените блок с подключениями этих модулей:

LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so #LoadModule php7_module /usr/local/opt/php70/libexec/apache2/libphp7.so

На следующий код.

# Brew PHP LoadModule for `sphp` switcher LoadModule php5_module /usr/local/lib/libphp5.so #LoadModule php7_module /usr/local/lib/libphp7.so

Сохраните файл настроек и закройте его.

Проверим возможность переключения версий PHP.

Выполните команду sphp с двумя цифрами нужной версии.

$ sphp 70 PHP version 70 found Unlinking old binaries. .. Linking new binaries... Linking /usr/local/Cellar/php70/7.0.14_7... 17 symlinks created Linking new modphp addon... Fixing LoadModule... Updating version file... Restarting homebrew Apache... Restarting non-root homebrew Apache... Done. PHP 7.0.14 (cli) (built: Dec 14 2016 01:24:46) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

Откройте страницу http://localhost/ и убедитесь, что теперь активен PHP версии 7.0.

Установка MySQL

Для установки MySQL введите следующую команду.

$ brew install mysql

Завершение установки подтвердит следующее сообщение.

We've installed your MySQL database without a root password. To secure it run: mysql_secure_installation To connect run: mysql -uroot To have launchd start mysql now and restart at login: brew services start mysql Or, if you don't want/need a background service you can just run: mysql. server start ==> Summary /usr/local/Cellar/mysql/5.7.16: 13,511 files, 439M

Выполните указанные действия, если необходимо установить mysql на автозапуск.

$ brew services start mysql

Установка Redis, Memcached

С помощью Homebrew установка дополнительного ПО максимально проста.

Установим Redis.

$ brew install redis ==> Downloading https://homebrew.bintray.com/bottles/redis-3.2.6.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring redis-3.2.6.sierra.bottle.tar.gz ==> Caveats To have launchd start redis now and restart at login: brew services start redis Or, if you don't want/need a background service you can just run: redis-server /usr/local/etc/redis.conf ==> Summary /usr/local/Cellar/redis/3. 2.6: 11 files, 1.7M

Настроим автозагрузку и запустим Redis.

$ brew services start redis

Установим Memcached.

$ brew install memcached ==> Downloading https://homebrew.bintray.com/bottles/memcached-1.4.33.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring memcached-1.4.33.sierra.bottle.tar.gz ==> Caveats To have launchd start memcached now and restart at login: brew services start memcached Or, if you don't want/need a background service you can just run: /usr/local/opt/memcached/bin/memcached ==> Summary /usr/local/Cellar/memcached/1.4.33: 11 files, 184.5K

Настроим автозагрузку и запустим Memcached.

$ brew services start memcached

Теперь необходимо установить PHP расширений для работы со свежеустановленнымы сервисами для каждой версии вам нужно загрузить расширения, которые требуются.

$ sphp 70 $ brew install php70-redis $ brew install --HEAD homebrew/php/php70-memcached

Перезагрузите Apache и снова откройте http://localhost/.

$ sudo apachectl restart

В пункте “ дополнительные .ini файлы” вы увидите ini файлы установленных расширений.

Вы также можете заметить, что нужные расширения подгружены и готовы к работе.

Смените версию PHP перед началом установки расширений для нее.

$ sphp 56 $ brew install php56-redis php56-memcache php56-memcached

Снова перезагрузите Apache и откройте http://localhost/, чтобы убедиться в успехе.

$ sudo apachectl restart

Создание локального сайта

Для работы над несколькими проектами сразу удобно создать отдельную папку и доменное имя для каждого.

Например, ваш проект называется сodex. Первым делом создайте директорию.

$ mkdir ~/Sites/codex

Локальный сайт codex.local будет находиться на вашем компьютере. Поэтому нужно прописать в файле /etc/hosts адрес сервера и доменное имя.

$ sudo open -e /etc/hosts

Добавьте в конец файла следующую строку.

127.0.0.1 codex.local

Теперь надо настроить сам Apache сервер. Для этого откройте для редактирования файл настроек хостов.

$ open -e /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf

Добавьте следующий код, описывающий новый хост, в файл настроек. Название проекта codex уже вписано в нужные строки. Замените your_user на логин вашего пользователя.

# корневая директория проекта codex DocumentRoot /Users/your_user/Sites/codex # доменное имя ServerName codex. local # настройка прав доступа к директории проекта AllowOverride All Order allow,deny Allow from all

Перед подключением первого локального сайта необходимо включить возможность использования хостов.

Откройте для редактирования файл /usr/local/etc/apache2/2.4/httpd.conf. Необходимо раскомментировать строку с подключением файла настроек виртуальных хостов. 

# Virtual hosts Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf

После этих действий нужно перезагрузить сервер.

$ sudo apachectl restart

Теперь сайт, находящийся в директории ~/Sites/codex, будет доступен по адресу http://codex.local/.

Заключение

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

В этой статье представлен наиболее простой способ разворачивания рабочего окружения непосредственно на операционной системе. Существуют и другие способы решения описанных задач: например, с использованием Open Server (для Windows) или виртуализации с помощью VirtualBox, VMWare, Vagrant, Docker и других утилит. Об использовании докера читайте в статье «Как поднять сайт в Docker».

Материалы

  • Статья-источник https://getgrav.org/blog/macos-sierra-apache-multiple-php-versions
  • Homebrew http://brew.sh

PHP Server Monitor — Записки админа

Делаем очень простой мониторинг сервера или сайта с помощью скрипта PHP Server Monitor. Для установки и базовой работы подойдёт почти любой хостинг или сервер.

Для запуска скрипта, нам потребуется:

— PHP версии 5.3.7 и выше.
— PHP модули curl и mysql.
— Непосредственно MySQL\MariaDB база.

Установка PHP Server Monitor.

Ставим PHP Server Monitor как любой другой PHP скрипт.

1. Скачиваем, распаковываем, запускаем install.php в браузере. Ссылка на загрузку доступна на странице проекта. Загружаем архив на сервер удобным для нас способом (работая по SSH, если есть такая возможность, либо по FTP, если это обычный хостинг).

2. Жмём на кнопку Let’s go, следуем инструкциям системы.

  • Указываем данные для соединения с базой данных (она, конечно же, должна быть предварительно создана), адрес панели мониторинга.
  • Следующим шагом PSM попытается записать конфиг, если у него по какой-то причине не хватит прав, будет предложено создать config.php вручную.
  • Последним шагом здесь будет создание пользователя, которым мы и будем работать с мониторингом.
Добавляем ресурс в мониторинг.

1. Авторизуемся в панели созданным ранее пользователем и переходим в раздел Servers. Нажимаем на кнопку «Add new +» для добавления нового сервиса.

2. На открывшейся странице заполняем нужные нам данные:

  • Label — название (метка) ресурса в мониторинге.
  • Domain/IP — имя домена или IP адрес, который мы будем мониторить.
  • Type — тип мониторинга. Здесь мы можем выбрать простой пинг, указать конкретный сервис, либо указать адрес сайта. В соответствии с выбором далее система предложит настроить либо сервис/порт, который будет проверяться, либо ключевое слово, которое будет проверять мониторинг на странице. Так же, будет предложено настроить таймауты проверки.
  • Warning threshold — количество failed ответов, после которого сервер будет помечен как упавший.

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

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

Когда всё будет заполнено и настроено, нажимаем на кнопку Save, переходим во вкладку Status и видим там наш добавленный ресурс.

Настраиваем уведомления.

Монитоинг поддерживает несколько видов уведомлений — email, sms, pushover. Всё это настраивается во вкладке Config, далее, в соответствующей секции. Для почты имеется возможность прописать данные для SMTP авторизации, для отправки SMS уведомлений доступны на выбор несколько провайдеров, ну а для PUSH сообщений потребуется аккаунт на pushover.net

Дополнительные настройки.

Опять же, в разделе Config, в секции General мы при необходимости можем настроить язык интерфейса (русский имеется), указать ключ, которым будут зашифрованы введённые пароли, задать статус, в соответствии с которым будут отправляться уведомления, включить логи и, при необходимости, подключить работу через proxy сервер.

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

@SysadminNotes | https://sysadmin.pm

Изменение версии PHP | ISPserver

Существует несколько способов поменять версию PHP, в том числе и напрямую через командную строку сервера. Мы рассмотрим способы, которые предлагает панель управления ISPmanager. Она позволяет выполнить настройки через удобный web-интерфейс, не прибегая к ручным настройкам сервера.

Версия PHP как модуль Apache

Такая возможность появилась в ISPmanager версии 5.90.

Чтобы использовать версию PHP как модуль Apache, установите её на сервер. Выполнить установку вы можете в разделе Настройки → Возможности. Выберите нужную версию и нажмите кнопку Изменить, как указано на скриншоте.

 

В открывшемся окне установите галочку в поле ISPsystem модуль PHP для Apache версии 5. 4 (указанная версия PHP зависит от выбранной вами) и нажмите кнопку Применить изменения.

 

После начнётся установка выбранной версии PHP. Когда установка будет завершена, перейдите в раздел Настройки web-сервера → PHP, выберите установленную версию PHP и нажмите кнопку Как модуль Apache.

 

Готово! Теперь сайт использует установленную версию PHP через модуль Apache. Чтобы удостовериться, что на сервере используется установленная версия PHP, перейдите в раздел Домены → WWW-домены, информация указана в полях Режим работы PHP и Версия PHP.

 

Версия PHP как модуль CGI

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

Важно! Использовать PHP в режиме CGI могут только пользователи с соответствующими правами. Чтобы проверить, имеет ли ваш пользователь эти права, перейдите в раздел Учётные записи → Пользователи. Выберите пользователя, для которого вы настраиваете версию PHP, и нажмите кнопку Изменить. Далее найдите пункт Может использовать PHP в режиме CGI и установите напротив него галочку, после нажмите кнопку Ок. Если галочка установлена, переходите к следующему шагу.

 

Теперь нужно установить необходимую версию PHP на сервере. Для этого перейдите в раздел Настройки → Возможности, выберите нужную версию PHP и нажмите кнопку Изменить.

 

Проверьте, чтобы в поле ISPsystem PHP версии 5.4 был выбран пункт PHP 5.4 CGI (указанная версия PHP зависит от выбранной вами). После этого нажмите кнопку Применить изменения.

По умолчанию можно использовать PHP-FPM — стоит галочка в пункте ISPsystem PHP 5. 5 для PHP-FPM. Если вам не нужна эта возможность, уберите галочку.

 

По завершении установки перейдите в раздел Домены → WWW-домены, выберите сайт для которого требуется изменить версию PHP и нажмите кнопку Изменить. В открывшемся окне измените пункт Режим работы PHP на CGI и нажмите кнопку Ок.

 

Если вам нужен модуль FastCGI

— потребуется установка web-сервера Nginx. Далее в панели ISPmanager, пункт Версия PHP (CGI) нужно установить необходимую версию PHP (изменить версию PHP можно, если на сервере установлено несколько версий). Для применения настроек нажмите кнопку Ок.

 

Чтобы проверить, используется ли установленная версия PHP, перейдите в раздел Домены → WWW-домены. Поля Режим работы PHP и Версия PHP сообщают о версии PHP, которая используется на сайте.

Монитор сервера PHP | Инструмент с открытым исходным кодом для мониторинга ваших серверов и веб-сайтов

PHP Server Monitor — это скрипт, который проверяет, работают ли ваши веб-сайты и серверы. Он поставляется с пользовательским веб-интерфейсом, с помощью которого вы можете управлять своими услугами и веб-сайтами, а также управлять пользователями для каждого сервера с помощью номера мобильного телефона и адреса электронной почты.

Характеристики

  • Мониторинг сервисов и веб-сайтов (см. Ниже).
  • Уведомления по электронной почте, SMS и Pushover.net.
  • Просмотр архивных графиков времени безотказной работы и задержки.
  • Аутентификация пользователя с 2 уровнями (администратор и обычный пользователь).
  • Журналы ошибок подключения, исходящих писем и текстовых сообщений.
  • Простая реализация cronjob для автоматической проверки ваших серверов.

Существует два разных способа мониторинга сервера:

  • Сервис

    Будет выполнено соединение с введенным IP-адресом или доменом на данном порту. Таким образом вы можете проверить, работают ли все еще определенные службы на вашем компьютере.Например, чтобы проверить службу IMAP, введите порт 143.

  • Сайт

    Вы можете ввести ссылку на веб-сайт (например, http://sourceforge.net/index.php), он будет использовать cURL для открытия веб-сайта и проверки кода состояния HTTP (см. Http://en.wikipedia.org / wiki / List_of_HTTP_status_codes для подробностей). Если код состояния HTTP находится в диапазоне 4xx, это означает, что произошла ошибка и веб-сайт недоступен для публики. Вы также можете установить регулярное выражение для соответствия определенному контенту на самой странице.Если регулярное выражение не возвращает совпадений, веб-сайт считается неработающим. В обоих случаях скрипт вернет «статус офлайн» и начнет рассылку уведомлений.

У каждого сервера свои настройки уведомлений.
Вы можете выбрать электронную почту, текстовое сообщение (SMS) и уведомления Pushover.net.
В настоящее время доступны следующие SMS-шлюзы:

  • Clickatell — https://www. clickatell.com
  • Inetworx — http: // www.inetworx.ch
  • Молли — http://www.mollie.nl
  • Мосмс — http://www.mosms.com
  • Smsglobal — http://www.smsglobal.com
  • SMSit — http://www.smsit.dk
  • Спринг — http://www.spryng.nl
  • Textmarketer — http://www.textmarketer.co.uk

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

Если в конфигурации включено ведение журнала, в нем будут регистрироваться все ошибки подключения, отправленные электронные и текстовые сообщения.Последние записи журнала будут отображаться в вашем веб-интерфейсе. Cron / status.cron.php можно добавить как задание cron, которое будет поддерживать статус сервера в актуальном состоянии.

Требования

  • PHP 5.3.7+
  • Пакеты PHP: cURL, MySQL
  • База данных MySQL

Загрузить

Последнюю версию можно найти здесь. Если вы хотите внести свой вклад в этот проект, вы можете клонировать репозиторий из Github здесь.

Лицензия

PHP Server Monitor — бесплатное программное обеспечение: вы можете распространять и / или изменять его в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии. .

PHP Server Monitor распространяется в надежде, что он будет полезен, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии ТОВАРНОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Подробнее см. Стандартную общественную лицензию GNU.

Вы должны были получить копию Стандартной общественной лицензии GNU вместе с PHP Server Monitor. Если нет, см. Http://www.gnu.org/licenses/.

Что такое $ _SERVER в PHP?

$ _SERVER [‘PHP_SELF’] Содержит имя файла выполняемого в данный момент сценария.
$ _SERVER [‘GATEWAY_INTERFACE’] Содержит версию общего интерфейса шлюза, используемую сервером.
$ _SERVER [‘SERVER_ADDR’] Содержит IP-адрес сервера.
$ _SERVER [‘SERVER_NAME’] Содержит имя хоста сервера.
$ _SERVER [‘SERVER_SOFTWARE’] Содержит строку идентификации сервера.
$ _SERVER [‘SERVER_PROTOCOL’] Содержит имя и версию протокола версии.
$ _SERVER [‘REQUEST_METHOD’] Содержит метод запроса, используемый для доступа к странице.
$ _SERVER [‘REQUEST_TIME’] Содержит отметку времени начала запроса.
$ _SERVER [‘QUERY_STRING’] Содержит строку запроса, если доступ к странице был осуществлен с помощью запроса.
$ _SERVER [‘HTTP_ACCEPT’] Содержит заголовок Accept из текущего запроса.
$ _SERVER [‘HTTP_ACCEPT_CHARSET’] Содержит заголовок Accept_charset из текущего запроса.
$ _SERVER [‘HTTP_HOST’] Содержит заголовок Host из текущего запроса.
$ _SERVER [‘HTTP_REFERER’] Содержит URL-адрес текущей страницы.
$ _SERVER [‘HTTPS’] Содержит информацию о том, был ли запрошен сценарий с использованием безопасного протокола.
$ _SERVER [‘REMOTE_ADDR’] Содержит IP-адрес, с которого пользователь переходит на текущую страницу.
$ _SERVER [‘REMOTE_HOST’] Содержит имя хоста, с которого пользователь переходит на текущую страницу.
$ _SERVER [‘SCRIPT_FILENAME’] Содержит путь к выполняющемуся в данный момент сценарию.
$ _SERVER [‘SERVER_ADMIN’] Содержит значение, указанное для SERVER_ADMIN в файле конфигурации.
$ _SERVER [‘SERVER_PORT’] Содержит порт на веб-сервере, который используется для связи.
$ _SERVER [‘SERVER_SIGNATURE’] Содержит версию сервера и имя виртуального хоста, которые добавляются к страницам, созданным сервером.
$ _SERVER [‘PATH_TRANSLATED’] Содержит путь файловой системы к текущему сценарию.
$ _SERVER [‘SCRIPT_NAME’] Содержит путь к текущему сценарию.
$ _SERVER [‘SCRIPT_URI’] Содержит URL-адрес текущего сценария.

Как обновить PHP на вашем сайте или сервере. — Справочный центр iThemes

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

Кроме того, истекает срок жизни более старых версий PHP. Активная поддержка версии 5.6 закончилась в начале 2017 года. Поддержка безопасности будет предоставляться только до конца 2018 года. Это означает, что следует использовать версии PHP 5.6 или выше, поскольку они являются единственными версиями, которые в настоящее время получают обновления безопасности. Так что, если вы планируете обновить PHP, он должен быть до версии 5.6 или выше.

Перед обновлением PHP …

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

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

Существуют также плагины, которые проверят код на вашем сайте, чтобы узнать, совместимы ли они с более поздними версиями PHP.

PHP Compatibility Checker Этот плагин вставляет тему и код плагина в файловую систему WordPress и возвращает вам отчет о проблемах совместимости, которые вы должны исправить. Проблемы совместимости подразделяются на ошибки и предупреждения, в них будет указан файл и номер строки кода-нарушителя, а также информация о том, почему эта строка кода несовместима с выбранной версией PHP.

Error Log Monitor Этот плагин будет регистрировать ошибки PHP на панели инструментов WordPress, чтобы вы могли видеть, есть ли у вас какие-либо входящие ошибки несовместимости при использовании более свежей версии PHP.Вы всегда захотите посмотреть журналы ошибок вашего сайта после обновления PHP, чтобы вы могли видеть, вызывает ли он какие-либо ошибки, которых раньше не было на вашем сайте.

Примечание. Это плагины сторонних производителей, которые никоим образом не связаны с iThemes; устанавливаете их на свой сайт на свой страх и риск.

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

Перед обновлением версии PHP всегда рекомендуется сделать РЕЗЕРВНОЕ КОПИРОВАНИЕ вашего сайта !!

Пора обновить PHP!

Как указывалось ранее в статье, лучше убедиться, что ваш сайт работает на версии 5.6 или выше, поскольку любая предыдущая версия больше не получает обновления безопасности. Пытаясь выяснить, на какую версию PHP переключиться или обновить, рекомендуется проверить статью о кодексе требований WordPress здесь: https://wordpress.org/about/requirements/ В этой статье вы узнаете, какую версию PHP рекомендует WordPress. что вы используете.

Виртуальный хостинг:

Если вы работаете на платформе виртуального хостинга, скорее всего, у вашего хоста есть несколько версий PHP, из которых вы можете выбрать. Часто их можно переключить из cpanel или настраиваемой панели управления, предоставленной вашим хостом. Просто выберите версию 5.6 или выше и сохраните настройку. Если нет возможности изменить это с панели управления вашего хоста, свяжитесь с ними напрямую и попросите обновить ваш PHP до версии 5.6+ или выше.

Если они откажутся обновить ваш PHP до версии 5.6+ или переместите свой сайт на сервер, на котором установлена ​​более свежая версия PHP, пора сменить хост.

VPS или выделенный сервер:

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

Если вы используете ubuntu 14.04 или выше, вы можете использовать следующие команды:

Это добавит репозиторий для PHP версии 5.6 и 7.0

 sudo apt-add-репозиторий ppa: ondrej / php 

Для установки и обновления до версии 5. 6 используйте команду:

  sudo apt-get install php5.6  

Затем для версии 7.0 используйте команду:

  sudo apt-get install php7.0 

Если вы используете MYSQL, вам необходимо выполнить следующую команду для PHP 7:

 sudo apt-get install php7.0-mysql 

Теперь осталось только перезапустить сервер, чтобы изменения вступили в силу.

Apache:

 sudo service apache2 перезапуск 

Nginx:

 sudo service nginx перезапуск 

Если вы используете PHP-FPM с NGINX, следуйте этому руководству здесь:

Install or Upgrade to PHP 7.X on Ubuntu

Если вы хотите выполнить обновление до PHP 7 при использовании других дистрибутивов Linux, следуйте приведенным ниже инструкциям.

CentOS:

https://linuxconfig.org/how-to-install-or-upgrade-to-php-7-on-centos-linux-server

Debian:

https: // www. cyberciti.biz/faq/installing-php-7-on-debian-linux-8-jessie-wheezy-using-apt-get/

Backdoor добавлен в исходный код PHP в Git server break

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

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

Злоумышленник отправил два вредоносных коммита в репозиторий php-src — один на имя самого создателя PHP Расмуса Лердорфа, а другой, замаскированный под подписью известного разработчика и сопровождающего PHP Никиты Попова. Первая фиксация якобы исправляла небольшую опечатку в коде, тогда как вторая фиксация утверждала, что отменила исправление.

«Мы пока не знаем, как именно это произошло, но все указывает на компромисс с git. php.net (а не компрометация отдельной учетной записи git) », — сказал Попов в объявлении о компрометации, которое было обнаружено в воскресенье.

В беседе с BleepingComputer Попов сказал, что они заметили первую фиксацию во время рутинной проверки кода после фиксации, и изменения в коде были немедленно отменены — вовремя, прежде чем они могли быть перенесены в производственную среду. Серверный язык с открытым исходным кодом обычно используется в веб-разработке.

Изменение кода впервые заметили участники Маркус Стааб, Майкл Воржишек и Джейк Бирчалл.Воржишек заподозрил изменение кода и спросил о его функции, на что Бирчалл ответил, что «строка выполняет код PHP из HTTP-заголовка агента пользователя, если строка начинается с« нулевого ».

Действительно, похоже, что злоумышленники хотели привлечь к себе внимание Zerodium, компании, которая позиционирует себя как «ведущая платформа для сбора эксплойтов премиум-класса нулевого дня». Однако, по словам его генерального директора, брокер нулевого дня не имел никакого отношения к инциденту.

Приветствия троллю, который поместил «Zerodium» в сегодняшние коммиты PHP, подвергнутые риску git.Очевидно, мы тут ни при чем.

Вероятно, исследователь (и), обнаруживший эту ошибку / эксплойт, пытался продать его многим организациям, но никто не хотел покупать это дерьмо, поэтому они сожгли его ради развлечения 😃

— Чауки Бекрар (@cBekrar) 29 марта 2021 г.

После взлома команда PHP решила перейти от собственной инфраструктуры Git, чтобы снизить риски. «Пока расследование все еще продолжается, мы решили, что поддержка нашей собственной инфраструктуры git представляет собой ненужную угрозу безопасности, и что мы прекратим использование git.сервер php.net. Вместо этого репозитории на GitHub, которые раньше были только зеркалами, станут каноническими. Это означает, что изменения следует отправлять непосредственно на GitHub, а не на git.php.net », — сказал Попов.

Команда PHP теперь настаивает на дополнительной безопасности. Если раньше разработчикам, которые хотели внести свой вклад, необходимо было использовать «самодельную» систему кармы, теперь им необходимо стать участниками репозитория PHP на GitHub и включить двухфакторную аутентификацию.

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

GraphQL Code Libraries, Tools and Services

GraphQL by PoP следует подходу «сначала код» для генерации схемы (ее можно настроить для разных клиентов / приложений).Поля динамически «подписываются» на типы и могут или не могут быть добавлены в схему в зависимости от контекста.

Вот как удовлетворяется тип User :

 

class UserTypeResolver extends AbstractTypeResolver

{

общедоступная функция getTypeName (): строка

{

return 'User';

}

общедоступная функция getSchemaTypeDescription ():? Строка

{

$ translationAPI = TranslationAPIFacade :: getInstance ();

return $ translationAPI -> __ ('Представление пользователя', 'пользователи');

}

общедоступная функция getID (объект $ user)

{

return $ user-> ID;

}

общедоступная функция getTypeDataLoaderClass (): строка

{

return UserTypeDataLoader :: class;

}

}

Обратите внимание, что TypeResolver не указывает, какие поля являются его полями.Он также не загружает объекты из базы данных, а вместо этого делегирует эту задачу TypeDataLoader .

Добавление полей к типу выполняется с помощью FieldResolver :

 

класс UserFieldResolver расширяет AbstractDBDataFieldResolver

{

общедоступная статическая функция getClassesToAttachTo (): array

::

{return

::

{return

];

}

общедоступная статическая функция getFieldNamesToResolve (): массив

{

return [

'имя пользователя',

'электронная почта',

'url',

];

}

общедоступная функция getSchemaFieldDescription (

TypeResolverInterface $ typeResolver,

строка $ fieldName

):? String {

$ translationAPI = TranslationAPIFacade :: getInstance ();

$ descriptions = [

'username' => $ translationAPI -> __ («Дескриптор имени пользователя», «пользователи»),

'email' => $ translationAPI -> __ («Электронная почта пользователя», «пользователи "),

'url' => $ translationAPI -> __ (" URL профиля пользователя на сайте "," пользователи "),

];

return $ descriptions [$ fieldName];

}

общедоступная функция getSchemaFieldType (

TypeResolverInterface $ typeResolver,

строка $ fieldName

):? String {

$ types = [

'username' => SchemaDefinition => Определение схемы :: TYPE_EMAIL,

'url' => Определение схемы :: TYPE_URL,

];

return $ types [$ fieldName];

}

общедоступная функция resolveValue (

TypeResolverInterface $ typeResolver,

объект $ user,

строка $ fieldName,

массив $ fieldArgs = []

) {

) переключатель case ($ field 'имя пользователя':

return $ user-> user_login;

case 'email':

return $ user-> user_email;

case 'url':

$ userService = UserServiceFacade :: getInstance ();

return $ userService-> getUserProfileURL ($ user-> ID);

}

return null;

}

}

Определение поля для схемы GraphQL и его разрешение разбиты на множество функций из FieldResolver :

  • getSchemaFieldDescription
  • getSchemaFieldDescription

  • getS resolveValue
  • getSchemaFieldArgs
  • isSchemaFieldResponseNonNullable
  • getImplementedInterfaceClasses
  • resolveFieldTypeResolverClass
  • resolveFieldMutationResolverClass

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

Докеризация приложения PHP — Учебное пособие по семафорам

В этом руководстве вы узнаете, что такое Docker и как его использовать для создания переносимого образа для ваших PHP-приложений. Вы узнаете, как использовать непрерывную интеграцию и развертывание (CI / CD) для создания и развертывания образа на Heroku.

Докеризация вашего PHP-приложения выгодна, потому что:

  • Контейнеры портативны и могут быть мгновенно развернуты в любом месте.
  • Контейнеры предоставляют разработчикам единообразную и оптимизированную рабочую среду, которую можно легко совместно использовать.
  • Контейнеры — это первый шаг к запуску вашего приложения с высокой доступностью с помощью Docker Swarm или Kubernetes.

Прочитав руководство, вы узнаете, что такое Docker и как он работает. Вы узнаете все тонкости объединения Docker с PHP и научитесь использовать непрерывную интеграцию и доставку для тестирования вашего приложения, создания контейнера и его развертывания.

В частности, вы узнаете, как:

  • Установка Docker
  • Запуск образов Docker
  • Создание образов клиентов для запуска программ
  • Использование Docker Compose для настройки среды разработки
  • Запуск нашего приложения в Heroku
  • Протестируйте наше приложение с непрерывной интеграцией (CI)
  • Разверните наш приложение с непрерывным развертыванием (CD)

Для практики мы начнем с демонстрационного приложения, которое взаимодействует с Unsplash API для поиска фотографий.Приложение построено с использованием Laravel.

Приступим:

  • Установите Git на свой компьютер.
  • Зарегистрируйтесь на GitHub.
  • Перейти в демонстрационное приложение.
  • Используйте кнопку Fork , чтобы скопировать репозиторий в свою учетную запись:
  • Используйте кнопку Clone или Download , чтобы получить URL вашего репозитория:
  • Клонируйте репозиторий на вашем компьютере. Откройте терминал и введите:
  $ git clone YOUR_REPOSITORY_URL.
$ cd семафор-демо-php-unsplash  

Запустить демонстрацию

Для запуска приложения на вашем компьютере вам потребуется:

  • PHP 7
  • Менеджер пакетов композитора.
  • Один ключ API Unsplash.

Получить ключ API просто:

  • Зарегистрируйтесь на Unsplash.
  • Перейдите в Приложения.
  • Выберите Новое приложение .
  • Прочтите и примите Условия использования.
  • Задайте имя для приложения.
  • Скопируйте ключ доступа и секретный ключ , как показано.

Подготовьте среду приложения и установите зависимости:

  $ cd src
$ composer install
$ cp.env.example .env
$ cp .env.example.unsplash .env-unsplash
Ключ $ php artisan: сгенерировать  

Вам нужно будет импортировать Unplash Key как переменные среды:

  • Отредактируйте файл .env-unsplash .
  • Введите ключи доступа и секретные ключи рядом с переменными.
  экспорт UNSPLASH_ACCESS_KEY = 22bc8e1f93fc4cc12ed3428f2e41ffe4f193dada12c414721811658012cc24b4
экспорт UNSPLASH_SECRET_KEY = 1e61323d10a0ccdf955744e25d2b73fe4c10dc63a5a2597bb9103da614c7a36c  
  • Создайте файл и запустите приложение:
  $ source.env-unsplash
$ php artisan serve  

Откройте свой браузер на http://127.0.0.1:8000 и попробуйте:

Что такое докер?

Большинство разработчиков используют стек AMP (W | L | M) в качестве отправной точки, но эта среда может очень быстро стать подавляющей. Как только вы начнете чувствовать эту боль, вы начнете использовать виртуальную среду, чтобы с легкостью делиться и воспроизводить.

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

Предварительные требования

Docker можно установить на большинстве платформ. Вы можете установить его из двоичного исполняемого файла или с помощью официального установщика.

Установка Docker

Рабочий стол Docker

Если вы используете последние версии Windows или Mac , установите Docker Desktop, и все готово.

Если вы являетесь пользователем Linux , пакеты Docker очень популярны и обычно включаются в репозиторий вашего дистрибутива.Например, установить его на Ubuntu или Debian так же просто, как:

  $ apt-get update && apt-get install docker  

Образы Docker

Docker основан на концепции создания образов, содержащих необходимое программное обеспечение и конфигурацию для приложений. Мы также можем создавать распространяемые образы, которые содержат предварительно настроенное программное обеспечение, такое как сервер Apache, сервер кэширования, база данных MySQL и т. Д. Мы можем опубликовать наш окончательный образ в Docker Hub, чтобы сделать его доступным для всех.

Работа с образами Docker

Мы можем вывести список доступных образов на нашей машине, выполнив команду docker images .

  $ образы докеров
РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАН ВИРТУАЛЬНЫЙ РАЗМЕР
ubuntu 14.04 91e54dfb1179 5 месяцев назад 188,4 МБ
nimmis / apache-php7 последнее bdd370e4f83b 6 месяцев назад 484,4 МБ
eboraas / apache-php последнее 0501b3fdd0c2 6 месяцев назад 367 МБ
mysql latest a128139aadf2 6 месяцев назад 283.8 МБ
ubuntu latest d2a0ecffe6fa 7 месяцев назад 188,4 МБ
eboraas / laravel последнее 407e2d00b528 12 месяцев назад 404.5 MB  

Чтобы просмотреть доступные образы, мы можем посетить Docker Hub и запустить docker pull , чтобы загрузить их на хост-компьютер.

Докер-контейнеры

Мы можем сравнить образ Docker с определением класса. Мы определяем его свойства и поведение.Контейнеры — это экземпляры, созданные из этого класса. Мы можем создать несколько экземпляров одного и того же изображения. Команда docker ps распечатывает список контейнеров, запущенных на машине. На данный момент у нас нет контейнеров, поэтому давайте создадим новый:

  $ docker run -d php: 7.4-apache
c6fbefcd630a2f4c970792af0302d9c25fe9118cec85091b04e75e7c942f5686  

Мы создали новый контейнер из образа php: 7-apache и использовали флаг -d для запуска задания в фоновом режиме.Выходной хеш — это идентификатор нашего контейнера, мы можем использовать его для доступа к контейнеру и поэкспериментировать с ним:

  $ докер пс

КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ ИМЕНА ПОРТОВ
c6fbefcd630a php: 7.4-apache "docker-php-entrypoi…" 39 секунд назад Вверх на 38 секунд 80 / tcp смеется_lalande  

Из вывода видно, что у контейнера есть идентификатор и имя.Давайте воссоздадим еще один контейнер и назовем его

.
  $ docker run -tid --name = "apache_server" php: 7.4-apache
fdae121b23e13690fedaab4636311d8ab6b35f32fa4c68e1c98726578de35a66

$ docker ps
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ ИМЕНА ПОРТОВ
fdae121b23e1 php: 7.4-apache "docker-php-entrypoi…" 16 секунд назад Вверх на 15 секунд 80 / tcp apache_server
c6fbefcd630a php: 7.4-apache "docker-php-entrypoi…" Около минуты назад Вверх Около минуты 80 / tcp смеется_lalande  

Экземпляры контейнеров создаются практически мгновенно, вы не заметите никакой задержки.

Теперь мы можем получить доступ к нашему контейнеру, выполнив команду bash и подключив ее к нашему терминалу:

  $ docker exec -it apache_server bash

(теперь вы запускаете сеанс внутри контейнера)
$ /etc/init.d/apache2 статус
[ok] apache2 запущен. 

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

  # Удалить контейнер по идентификатору или имени
docker rm -f <идентификатор-или-имя-контейнера>

# Удалить все доступные контейнеры
докер rm -f $ (докер ps -aq)  

Поскольку наш контейнер является сервером Apache, имеет смысл получить доступ к нему через браузер. При создании образа нам необходимо убедиться, что он открыт через определенный порт. Мы рассмотрим это более подробно в разделе Dockerfiles.

  $ docker run -tid \
        -p 8000: 80 \
        --name apache_server \
        php: 7.4-apache  

Мы можем получить IP-адрес нашего контейнера с помощью docker inspect :

  $ docker inspect \
   -f '{{диапазон .NetworkSettings.Networks}} {{. IPAddress}} {{end}}' \
   CONTAINER_ID_OR_NAME

172.19.0.2  

Последняя часть — сопоставить сервер Apache для запуска нашего приложения вместо домашней страницы Apache по умолчанию. Это означает, что нам нужно синхронизировать папку нашего приложения с корневой папкой сервера ( / var / www / html ).Мы можем сделать это с помощью опции -v . Подробнее о томах контейнеров можно прочитать в документации Docker:

  $ docker run -tid \
     -p 8000: 80 \
     --name apache_server \
     -v ВАШ_ХОСТ_WWW_ROOT: / var / www / html \
     php: 7.4-apache  

Всегда полезно взглянуть на описание образа в Docker Hub и прочитать инструкции о том, как правильно создавать контейнеры из образа.

Работа с Dockerfiles

Ранее мы упоминали, что каждый может создать образ Docker и поделиться им в Docker Hub, и что файлы Dockerfiles являются основным инструментом для этого.Мы собираемся посмотреть, как мы можем настроить собственное изображение и подогнать его под свои нужды. Список доступных команд можно найти в документации.

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

  $ CD ..  

Образ php: 7.4-apache устанавливает публичный каталог Apache на / var / www / html . Однако в этом случае, следуя соглашениям Laravel, нам нужно установить его на / var / www / public . Один из способов добиться этого — настроить конфигурацию виртуального хоста.Создайте файл с именем 000-default.conf со следующим содержимым:

  # 000-default.conf


  ServerAdmin веб-мастер @ localhost
  DocumentRoot / var / www / public

  
    Индексы опций FollowSymLinks
    AllowOverride All
    Требовать все предоставлено
  
  

Apache по умолчанию прослушивает порт 80 (HTTP), это не проблема при запуске сервера на вашем компьютере.Но некоторые облачные провайдеры требуют, чтобы контейнеры использовали разные порты.

Мы создадим сценарий для динамического переопределения порта Apache при запуске контейнера. Создайте файл с именем start-apache со следующим содержимым:

  #! / Usr / bin / env bash
sed -i "s / Listen 80 / Listen $ {PORT: -80} / g" /etc/apache2/ports.conf
sed -i "s /: 80 /: $ {ПОРТ: -80} / g" / etc / apache2 / sites-enabled / *
apache2-передний план  

И убедитесь, что файл исполняемый:

  $ chmod 755 start-apache  

Мы настроены на создание готового образа.Создайте файл с именем Dockerfile .

Мы будем использовать предложение FROM , чтобы использовать официальные образы php apache в качестве отправной точки:

  # Dockerfile
С php: 7.4-apache  

Теперь нам нужно КОПИРОВАТЬ файла в образ:

  ...

КОПИРОВАТЬ 000-default.conf /etc/apache2/sites-available/000-default.conf

...  

Laravel требует, чтобы был включен плагин Apache mod_rewrite , мы можем сделать это с помощью утилиты a2enmod RUN мы запускаем команды внутри контейнера:

  ...

ЗАПУСТИТЬ a2enmod rewrite

...  

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

  ...

КОПИРОВАТЬ src / var / www /
RUN chown -R www-data: www-data / var / www

...  

Последнее, что нам нужно сделать, это запустить сервер Apache в фоновом режиме. Команду CMD следует использовать только один раз в Dockerfile, и она должна иметь следующую форму:

  CMD ["исполняемый файл", "параметр1", "параметр2"]  

Назовем созданный ранее стартовый скрипт:

.
 ...

CMD ["start-apache"]  

Окончательный Dockerfile должен выглядеть так:

  С php: 7-apache

КОПИРОВАТЬ 000-default.conf /etc/apache2/sites-available/000-default.conf
КОПИРОВАТЬ start-apache / usr / local / bin
ЗАПУСТИТЬ a2enmod rewrite

# Копировать исходный код приложения
КОПИРОВАТЬ src / var / www /
RUN chown -R www-data: www-data / var / www

CMD ["start-apache"]  

Полезные команды

Хотя наш образ готов, мы рассмотрим некоторые команды, которые могут быть полезны для многих проектов.

Что, если бы мы хотели установить Node.js для управления нашими интерфейсными активами?

  RUN apt-get update && \
    apt-get установить nodejs  

Это установит Node.js и менеджер npm в наш образ. Мы можем многократно использовать команду RUN внутри одного Dockerfile, потому что Docker хранит историю создания нашего образа. Каждая команда RUN сохраняется как фиксация в истории версий.

Еще одна полезная команда — ENV .Он позволяет нам установить переменную среды в процессе сборки, а также будет присутствовать при создании контейнера. Обязательно ознакомьтесь с полным списком поддерживаемых команд в документации.

  ENV MYSQL_ROOT_PASSWORD = корень
ENV MYSQL_ROOT_USER = корень  

Создание образа

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

Наша папка содержит Dockerfile , 000-default.conf и start-apache . Команда docker build построит файл Dockerfile внутри текущего каталога:

  $ сборка докеров.

Отправка контекста сборки демону Docker 93.57MB
 Шаг 1/7: ИЗ php: 7-apache
  ---> 899ab23566b7
 Шаг 2/7: КОПИРОВАТЬ 000-default.conf /etc/apache2/sites-available/000-default.conf
  ---> e9c9fe481d06
 Шаг 3/7: КОПИРОВАТЬ start-apache / usr / local / bin
  ---> 791b85d17e63
 Шаг 4/7: ЗАПУСК a2enmod rewrite
  ---> Запуск в 2892dfaeb1c6
 Включение перезаписи модуля.Чтобы активировать новую конфигурацию, вам необходимо запустить:
   перезапуск службы apache2
 Снятие промежуточного контейнера 2892dfaeb1c6
  ---> 75777c1a4db7
 Шаг 5/7: КОПИРОВАТЬ src / var / www /
  ---> adf60c7d74b3
 Шаг 6/7: RUN chown -R www-data: www-data / var / www
  ---> Запуск в f678e9f02cd9
 Снятие промежуточного контейнера f678e9f02cd9
  ---> ce081623dfd5
 Шаг 7/7: CMD ["start-apache"]
  ---> Запуск в 34bf116a3b64
 Снятие промежуточного контейнера 34bf116a3b64
  ---> 19c684978566
 Успешно построен 19c684978566  

Если мы сейчас перечислим наши образы Docker, мы увидим наш новый собранный образ:

  $ образы докеров
РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАЦИОННЫЙ РАЗМЕР
<нет> <нет> 19c684978566 20 секунд назад 451 МБ
PHP 7.4-apache 0c37fe4343a5 2 недели назад 414MB  

В настоящее время у нашего образа нет имени, опция -t позволяет нам указать репозиторий изображений и тег.

Давайте присвоим изображению собственное имя. Синтаксис:

  $ тег докера SOURCE_IMAGE: TAG TARGET_IMAGE: TAG  

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

  $ docker tag 19c684978566 YOUR_DOCKERHUB_USER / semaphore-demo-php-unsplash  

Использование имени пользователя Docker Hub необязательно.Нам нужно использовать его только при отправке образа в реестр. Так как мы сделаем это дальше, мы можем теперь добавить к изображению окончательное имя.

Наше изображение теперь помечено и помечено:

  $ образы докеров
РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАЦИОННЫЙ РАЗМЕР
tomfern / semaphore-demo-php-unsplash последнее 19c684978566 3 минуты назад 451MBMB  

Последний шаг — отправить его в Docker Hub.Этот шаг не является обязательным, но он все же полезен, если мы планируем поделиться изображением и помочь другим в их среде разработки:

  • После входа в нашу учетную запись Docker Hub нам нужно нажать кнопку Create Repository :

Задайте имя и описание . Оставьте видимость Public :

Затем нам нужно запустить docker login в терминале и ввести наши учетные данные.После успешного входа в систему мы можем отправить наш образ в Docker Hub:

  $ докер логин

Войдите в систему со своим идентификатором Docker, чтобы отправлять и получать изображения из Docker Hub. Если у вас нет Docker ID, перейдите на https://hub.docker.com, чтобы создать его.
Имя пользователя: НАПИШИТЕ ВАШЕГО ПОЛЬЗОВАТЕЛЯ_DOCKERHUB
Пароль: ВВЕДИТЕ ПАРОЛЬ DOCKERHUB
ПРЕДУПРЕЖДЕНИЕ! Ваш пароль будет храниться в незашифрованном виде в .docker / config.json.
Настройте помощник по учетным данным, чтобы удалить это предупреждение. Видеть
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Вход выполнен успешно  

Вход в систему означает, что теперь вы можете отправить изображение:

  $ docker push YOUR_DOCKERHUB_USER / semaphore-demo-php-unsplash  

Docker Compose

Использование терминалов и запоминание команд не очень практично для создания контейнеров приложений и быстрого начала работы.Docker Compose использует файлы YAML для настройки и запуска контейнеров. Это означает, что мы можем отправить наше приложение Dockerfile для создания среды и использовать docker-compose.yml для запуска контейнеров.

Первым шагом является установка Docker Composer на нашу машину. Следуйте инструкциям в документации Docker, прежде чем переходить к следующим шагам.

Мы будем использовать docker-compose для запуска приложения внутри контейнера. Это ускорит разработку, поскольку мы сможем настроить нашу рабочую среду без необходимости устанавливать или настраивать сервер Apache.

Мы сопоставим файлы исходного кода с www-корнем контейнера, чтобы нам не пришлось перестраивать образ Docker во время кодирования.

Создайте docker-compose.yml со следующим содержимым:

  # docker-compose.yml
версия: "3.7"
Сервисы:
  webapp:
    строить:
      контекст:.
      dockerfile: ./Dockerfile.development

...
  

Это создаст наш образ с использованием другого файла Dockerfile, предназначенного только для разработки, который называется Dockerfile.разработка . Если у вас уже есть образ, созданный локально или в Docker Hub, вы можете вместо этого использовать свойство image :

  # docker-compose.yml
версия: "3.7"
Сервисы:
  webapp:
    изображение: YOUR_DOCKERHUB_USER / semaphore-demo-php-unsplash  

В службе webapp мы укажем открытые порты, тома и, возможно, некоторые переменные среды.

  ...

 порты:
      - «8000: 80»
    объемы:
      -./ SRC: / var / www
    среда:
      - APP_KEY = SomeRandomStringToAddSecurity123
      - APP_ENV = разработка
      - APP_DEBUG = true
      - APACHE_RUN_USER = apache-www-volume
      - APACHE_RUN_GROUP = apache-www-volume
      - UNSPLASH_ACCESS_KEY = $ {UNSPLASH_ACCESS_KEY}
      - UNSPLASH_SECRET_KEY = $ {UNSPLASH_SECRET_KEY}  

Окончательный docker-compose.yml выглядит так:

  версия: "3.8"
Сервисы:
  webapp:
    строить:
      контекст:.
      dockerfile:./Dockerfile.development
    порты:
      - «8000: 80»
    объемы:
      - ./src:/var/www
    среда:
      - APP_KEY = SomeRandomStringToAddSecurity123
      - APP_ENV = разработка
      - APP_DEBUG = true
      - APACHE_RUN_USER = apache-www-volume
      - APACHE_RUN_GROUP = apache-www-volume
      - UNSPLASH_ACCESS_KEY = $ {UNSPLASH_ACCESS_KEY}
      - UNSPLASH_SECRET_KEY = $ {UNSPLASH_SECRET_KEY}  

В дополнение к переменным Laravel и Apache мы устанавливаем ключ доступа Unsplash из переменных среды, поэтому наше приложение запускается с правильными токенами API.

Создайте новый файл с именем Dockerfile.development :

  # Dockerfile.development
С php: 7.4-apache

# Настроить конфигурацию Apache2
КОПИРОВАТЬ 000-default.conf /etc/apache2/sites-available/000-default.conf
ЗАПУСТИТЬ a2enmod rewrite

# используйте своих пользователей $ UID и $ GID ниже
ЗАПУСТИТЬ groupadd apache-www-volume -g 1000
ЗАПУСТИТЬ useradd apache-www-volume -u 1000 -g 1000

CMD ["apache2-foreground"]  

Основное отличие состоит в том, что Apache запускается с теми же идентификаторами пользователя и группы, что и ваш собственный — если разрешения не совпадают, приложение не запускается.

Проверьте свой идентификатор пользователя и идентификатор группы на вашем компьютере ( $ UID ) и идентификатор группы ( $ GID) и при необходимости замените числа.

Теперь мы можем запустить docker-composer до , чтобы создать наш контейнер:

  $ исходный код / ​​.env-unsplash
$ docker-compose up

Запуск semaphore-demo-php-unsplash_webapp_1 ... готово
Присоединение к semaphore-demo-php-unsplash_webapp_1
webapp_1 | AH00558: apache2: не удалось надежно определить полное доменное имя сервера с использованием 172.19.0.2. Установите глобальную директиву ServerName, чтобы подавить это сообщение.
webapp_1 | AH00558: apache2: Не удалось надежно определить полное доменное имя сервера с использованием 172.19.0.2. Установите глобальную директиву ServerName, чтобы подавить это сообщение.
webapp_1 | [Пт, 17 января, 13:38: 04.382337 2020] [mpm_prefork: notice] [pid 1] AH00163: Apache / 2.4.38 (Debian) PHP / 7.4.1 настроен - возобновление нормальной работы
webapp_1 | [Пт, 17 января, 13:38: 04.382375 2020] [core: notice] [pid 1] AH00094: Командная строка: 'apache2 -DFOREGROUND'  

Команда прикрепит вывод контейнера к терминалу, и нам нужно будет нажать ctrl + c , чтобы выйти.Этого можно избежать, используя параметр -d ( docker-composer up -d ). Если у нас несколько сервисов, мы можем указать, какой из них ( docker-composer up server ).

  $ docker ps -a

КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ ИМЕНА ПОРТОВ
7ec5

723 semaphore-demo-php-unsplash_webapp "docker-php-entrypoi…" 45 минут назад Повышение на 27 минут 443 / tcp, 0.0.0.0: 8000-> 80 / tcp семафор-демо-php-unsplash_webapp_1

Используйте команду docker-compose stop | rm для управления контейнером.

Наконец, добавьте все новые файлы в свой репозиторий:

  $ git add docker-compose.yml 000-default.conf Dockerfile * start-apache
$ git commit -m "добавить докер и конфигурацию apache"
$ git push origin master  

Использование Docker с Heroku

Heroku — это хостинговая платформа, которая может напрямую запускать наши образы Docker.Ознакомьтесь с инструкциями в документации.

Для начала:

  • Зарегистрируйтесь на Heroku.
  • Щелкните портрет своей учетной записи, а затем Учетная запись .
  • Прокрутите вниз до раздела «Ключи API». Запросите ключ API и скопируйте значение. Оно нам понадобится позже.
  • Создайте новое приложение , запомните его имя на будущее.
  • Установите Heroku CLI на свой компьютер и войдите в систему.Откроется окно браузера для входа в систему:
  $ heroku login  

Heroku имеет собственный реестр Docker. Нам нужно пометить и отправить изображение, используя имя вашего приложения:

  $ docker tag YOUR_DOCKERHUB_USERNAME / semaphore-demo-php-unsplash registry.heroku.com/YOUR_HEROKU_APP_NAME/web
$ docker push registry.heroku.com/YOUR_HEROKU_APP_NAME/web  

Задайте переменные среды для приложения. APP_KEY должен быть случайной 32-символьной строкой:

 
Конфигурация $ heroku: установите UNSPLASH_ACCESS_KEY = YOUR_UNSPLASH_ACCESS_KEY
Конфигурация $ heroku: установите UNSPLASH_SECRET_KEY = YOUR_UNSPLASH_SECRET_KEY
Конфигурация $ heroku: установить APP_ENV = production
Конфигурация $ heroku: установить APP_KEY = qiRKsBnNoFwwOo77rDVJbK1N6IQyBKHf
  

Наконец, включите некоторые оптимизации Docker и выпустите приложение:

  $ heroku labs: enable --app = YOUR_HEROKU_APP_NAME runtime-new-layer-extract
$ heroku stack: установить контейнер --app YOUR_HEROKU_APP_NAME
$ heroku container: release web --app YOUR_HEROKU_APP_NAME  

Теперь приложение должно быть запущено и работать по адресу: http: // YOUR_HERKOU_APP_NAME.herokuapp.com

Непрерывная интеграция с семафором

До этого момента мы перебрасывали команды направо и налево, устанавливали и пробовали разные вещи. Конечно, были допущены ошибки, и нам пришлось снова попробовать — все в порядке, это единственный способ научиться.

Рано или поздно мы захотим получать стабильные результаты и будем признательны за любой инструмент и методы, которые помогут нам автоматизировать тестирование и развертывание.

В этом разделе мы узнаем, как создать конвейер CI / CD для автоматизации всех процессов.

Непрерывная интеграция (CI) — это практика тестирования приложения при каждом обновлении, поэтому, как только мы вводим ошибку, мы ее узнаем. Семафор упростил непрерывную интеграцию нашего кода:

  • Зайдите в Semaphore и зарегистрируйтесь с помощью кнопки Зарегистрироваться с помощью кнопки GitHub .

Следующим шагом будет загрузка ключа доступа Unsplash в семафор. Для безопасного хранения конфиденциальной информации Semaphore предоставляет функцию секретов. Когда мы ссылаемся на секрет в Semaphore, он автоматически расшифровывается и становится доступным:

  • В левом меню навигации щелкните Secrets под Configuration .
  • Щелкните Создать новый секрет .
  • Создайте переменные среды, как показано, имя секрета должно быть «app-env»:
  • Создайте второй секрет для хранения учетных данных Docker Hub:
  • Создайте третий и последний секрет под названием «heroku» для хранения ключа API Heroku:

Теперь нам нужно добавить репозиторий GitHub в Semaphore:

  • В левом меню навигации нажмите + (знак плюса) рядом с Projects :
  • Найдите демонстрационный репозиторий и нажмите Выберите :
  • Выберите Я буду использовать существующую опцию конфигурации .Демонстрация поставляется со стартовой конфигурацией.

Semaphore подберет любую существующую конфигурацию CI, как только мы внесем изменения:

  • Откройте новое окно в GitHub и перейдите в демо-репозиторий.
  • Создайте пустой файл с помощью кнопки Создать файл :
  • Введите любое имя и используйте кнопку Commit .
  • Вернитесь в Semaphore и убедитесь, что рабочий процесс CI уже запущен:

Давайте рассмотрим существующую конфигурацию, чтобы узнать, как работает семафор:

  • Щелкните Edit Workflow , чтобы открыть Workflow Builder.
  • Щелкните основное серое поле под названием CI Pipeline . Основные компоненты трубопровода:

Основные компоненты семафора:

  • Конвейеры : Конвейер выполняет определенную задачу, например развертывание тестирования. Конвейеры состоят из блоков, которые выполняются слева направо.
  • Агент : агент — это виртуальная машина, которая управляет конвейером. У нас есть три типа машин на выбор. На машине работает оптимизированная Ubuntu 18.04 с инструментами сборки для многих языков.
  • Блоки : блоки состоят из заданий, которые имеют общую конфигурацию и назначение, например создание или тестирование. После завершения всех заданий в блоке можно начинать следующий блок.
  • Задания : Задания содержат команды, выполняющие работу. Задания в блоке выполняются параллельно, каждое в своей отдельной среде.

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

Подробнее о тестировании PHP:

7 инструментов непрерывной интеграции для PHP Laravel

Блок Install dependencies загружает модули PHP с composer:

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

  • checkout : клонирует репозиторий GitHub на компьютер CI. Большинство заданий вначале проходят проверку.
  • кэш : автоматически определяет структуру проекта и сохраняет модулей PHP в кэше семафоров. Восстановление кэша извлекает файлы, чтобы избежать их повторной загрузки.

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

Блок Tests выполняет интеграцию и тесты браузера.Блок импортирует секрет app-env , поскольку он необходим для запуска и тестирования приложения:

Непрерывное развертывание на семафоре

Мы расширим рабочий процесс CI двумя дополнительными конвейерами:

  • Dockerize : для создания рабочего образа Docker.
  • Развернуть : развернуть образ в Heroku.

Чтобы создать новую воронку, мы создадим промоакцию:

  • Нажмите + Добавить первое продвижение .
  • Назовите продвижение: «Dockerize»
  • Отметьте Включить автоматическое продвижение вариант:
  • Прокрутите вправо и назовите конвейер «Сборка Docker».
  • Щелкните новый блок и измените его имя на «Docker build».
  • Откройте пролог и введите следующее содержимое:
  checkout
cd src
восстановление кеша
композитор установить --no-dev
cd ..  
  • Задайте имя задания «Построить» и введите следующие команды:
  echo «$ DOCKER_PASSWORD» | docker login --username "$ DOCKER_USERNAME" --password-stdin
docker pull "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: latest || правда
docker build --cache-from "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: latest -t "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: $ SEMAPHORE_WORKFLOW_ID.docker push "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: $ SEMAPHORE_WORKFLOW_ID  
  • Откройте раздел Secrets и выберите dockerhub :
  • Щелкните Запустить рабочий процесс , а затем Запустить :

Обратите внимание, что мы помечаем наши новые изображения специальной переменной $ SEMAPHORE_WORKFLOW_ID. Переменные уникальны для каждого рабочего процесса, что поможет нам определить, какая версия образа соответствует каждой фиксации git и запуску CI / CD.

Реестр контейнеров семафоров

Конвейер Dockerize создает образ приложения с использованием двух источников: базового образа PHP и последней сборки. После сборки полученный образ отправляется в Docker Hub для подготовки к развертыванию. Сейчас оба образа извлекаются и отправляются в Docker Hub. Этот обмен между Docker Hub и Semaphore немного расточителен, мы можем оптимизировать задание сборки, переключившись на реестр контейнеров семафоров, в котором размещены популярные базовые образы, он работает быстрее, удобнее и не учитывается в Docker Hub. ограничения скорости.

Чтобы переключить репозиторий, сначала получите последний коммит с GitHub:

  $ git pull origin master  

Замените все содержимое Dockerfile следующими строками. Образ семафора не поставляется с Apache, поэтому мы добавим команду для его установки в процессе сборки.

  # Dockerfile
ИЗ registry.semaphoreci.com/php:7.4-node

 ЗАПУСТИТЬ apt-get update && apt-get install apache2
 ЗАПУСТИТЬ a2enmod rewrite

 КОПИРОВАТЬ 000-по умолчанию.conf /etc/apache2/sites-available/000-default.conf
 КОПИРОВАТЬ start-apache / usr / local / bin

 КОПИРОВАТЬ src / var / www /

 RUN chown -R www-data: www-data / var / www
 CMD ["start-apache"]  

Наконец, зафиксируйте изменение на GitHub. Теперь конвейер Dockerize должен работать немного быстрее.

  $ git добавить Dockerfile
$ git commit -m "использовать реестр докеров семафоров"
$ git push origin master  

Трубопровод развертывания

Semaphore знает, кто будет создавать наш образ Docker, и будет делать это при каждом обновлении.

Мы можем даже больше! Как насчет развертывания в Heroku одним щелчком мыши? Давайте добавим конвейер развертывания :

  • Снова нажмите Изменить рабочий процесс .
  • Прокрутите вправо и используйте + Добавить продвижение . Назовите продвижение: «Развернуть на Heroku»
  • Щелкните новый конвейер, назовите его: «Развернуть на Heroku».
  • Выберите блок, назовите его «Развернуть».
  • Откройте переменные среды и установите для переменной HEROKU_APP имя вашего приложения Heroku.
  • Откройте Secrets и проверьте dockerhub , heroku и app-env .
  • Назовите задание «Развернуть» и введите в поле следующие команды:
  echo "$ {DOCKER_PASSWORD}" | docker login -u "$ {DOCKER_USERNAME}" --password-stdin
docker pull "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: $ SEMAPHORE_WORKFLOW_ID
контейнер heroku: логин
тег docker "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: реестр $ SEMAPHORE_WORKFLOW_ID.heroku.com/$HEROKU_APP/web
docker push registry.heroku.com/$HEROKU_APP/web
конфигурация heroku: установите UNSPLASH_ACCESS_KEY = $ UNSPLASH_ACCESS_KEY
Конфигурация героя: установите UNSPLASH_SECRET_KEY = $ UNSPLASH_SECRET_KEY
Конфигурация heroku: установить APP_ENV = production
Конфигурация heroku: установите APP_KEY = qiRKsBnNoFwwOo77rDVJbK1N6IQyBKHf
heroku labs: включить --app = $ HEROKU_APP runtime-new-layer-extract
стек heroku: установить контейнер --app $ HEROKU_APP
Контейнер heroku: веб-релиз --app $ HEROKU_APP  

Добавим еще один блок.Он установит текущий тег изображения на , последний . Таким образом, мы всегда будем знать, какое изображение наиболее актуально в производстве:

  • Добавьте второй блок под названием «Отметить последнее изображение».
  • В Secrets выберите dockerhub
  • Введите следующие команды в поле задания:
  echo "$ {DOCKER_PASSWORD}" | docker login -u "$ {DOCKER_USERNAME}" --password-stdin
docker pull "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: $ SEMAPHORE_WORKFLOW_ID
тег докера "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: $ SEMAPHORE_WORKFLOW_ID "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: latest
docker pull "$ DOCKER_USERNAME" / semaphore-demo-php-unsplash: последний  
  • Нажмите Запустить рабочий процесс и Запустить.

Новый конвейер CI / CD будет запущен немедленно. Когда образ Docker будет готов, нажмите кнопку Promote :

И новый образ будет развернут на Heroku:

Заключение

В этом руководстве мы изучили основы использования Docker и научились создавать собственный образ Docker. Мы развернули демонстрационное приложение на Heroku и использовали Semaphore для непрерывного развертывания на производственном сервере.

Взгляните на финальную демонстрацию на Github.Если у вас есть какие-либо вопросы или комментарии, обязательно разместите их ниже, и мы постараемся на них ответить.

П.С. Хотите непрерывно доставлять свои приложения, созданные с помощью Docker и Kubernetes? Ознакомьтесь с поддержкой Docker от Semaphore.

Читать дальше:

Официальный сервер PHP Git нацелен на попытку похоронить вредоносное ПО в базе кода

Официальный сервер PHP Git был скомпрометирован при потенциальной попытке внедрить вредоносное ПО в кодовую базу проекта PHP.

В воскресенье разработчик и сопровождающий языка программирования PHP Никита Попов сообщил, что в репозиторий php-src были добавлены две вредоносные фиксации как на его имя, так и на имя создателя PHP Расмуса Лердорфа.

Вредоносные коммиты, которые, казалось, подписывались под именами Попова и Лердорфа (1,2), были замаскированы под простые типографические ошибки, которые необходимо было исправить.

Однако вместо того, чтобы избежать обнаружения и выглядеть столь безобидно, участники, внимательно изучившие «Исправить опечатку», зафиксировали вредоносный код, который запускал произвольный код в HTTP-заголовке агента пользователя, если строка начиналась с содержимого, связанного с Zerodium.

Как отмечает Bleeping Computer, код, по-видимому, предназначен для внедрения бэкдора и создания сценария, в котором возможно удаленное выполнение кода (RCE).

Попов сказал, что команда разработчиков не совсем уверена, как именно произошла атака, но есть свидетельства того, что скорее всего был скомпрометирован официальный сервер git.php.net, а не отдельные учетные записи Git.

В сценарий был включен комментарий «REMOVETHIS: продано Zerodium, середина 2017 года». Однако нет никаких указаний на то, что продавец эксплойта имеет какое-либо участие в кибератаке.

Генеральный директор Zerodium Чауки Бекрар назвал виновного «троллем», комментируя, что «вероятно, исследователь (и), обнаруживший эту ошибку / эксплойт, пытался продать его многим организациям, но никто не хотел покупать это дерьмо, поэтому они сожгли его. ради забавы.»

Коммиты были обнаружены и отменены до того, как они были переданы ниже по течению или затронули пользователей.

В настоящее время ведется расследование инцидента безопасности, и команда исследует репозиторий на предмет любых других признаков злонамеренной деятельности.Тем временем, однако, команда разработчиков решила, что сейчас подходящее время для постоянного перехода на GitHub.

«Мы решили, что поддержка нашей собственной инфраструктуры git представляет собой ненужную угрозу безопасности, и что мы прекратим поддержку сервера git.php.net», — сказал Попов. «Вместо этого репозитории на GitHub, которые раньше были только зеркалами, станут каноническими. Это означает, что изменения следует отправлять непосредственно на GitHub, а не на git.php.net».

Разработчикам, ранее имевшим права записи в репозитории проекта, теперь необходимо присоединиться к группе PHP на GitHub.

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

Недавний пример — фиаско SolarWinds, в результате которого поставщик был взломан и было установлено вредоносное обновление для его программного обеспечения Orion. После развертывания этого вредоносного ПО были скомпрометированы десятки тысяч организаций, включая Microsoft, FireEye и Mimecast.

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


Есть чаевые? Безопасная связь через WhatsApp | Звоните по телефону +447713 025 499 или по телефону Keybase: charlie0


.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *