Установка вебсервера на Apple Silicon (нативный ARM стек), оптимизированный для 1С-Битрикс.

Просмотров: 10509

Появилась задачка, установить стек MAMP (macOS, Apache, MYSQL, PHP) на рабочий ноутбук с процессором Apple Silicon M1. В принципе, под macOs уже е сть готовое приложение MAMP-PRO, но на текущий момент оно работает через эмулятор Rosetta из-за чего теряет около 20% производительности и в целом подтупливает. Да и стоит почти 7000 рублей.

Решил установить именно адаптированные, ARM, версии софта в ручную из homebrew. Установка будет поддерживать виртуальные хосты, можно запускать любое количество сайтов.

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

Внимание! В установке не учитываю моменты безопасности. Подразумевается использование, исключительно для локальной разработки проектов - без доступа из интернета. Заметка обновлена в 2024 году, для установки php 8 и mariadb

Устанавливаем homebrew и необходимые пакеты.

Для начала установим сам homebrew и необходимые пакеты, для сборки остальных приложений. Установка займет достаточно продолжительное, запасаемся кофейком, открываем терминал и выполняем следующие команды:

Переходим в домашнюю директорию и запускаем установку homebrew

cd ~
mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
sudo mv homebrew /opt/homebrew

Переходим в директорию установки и запускаем обновление

cd /opt/homebrew/bin
./brew update

Экспортируем каталог homebrew/bin в PATH своего пользователя. Создаем файл .zshrc в директории пользователя.

nano ~/.zshrc

Вписываем в него и сохраняем:

export PATH="/opt/homebrew/bin:$PATH"

В целом! инструменты командной строки для разработчиков, должны были установиться при обновлении ./brew update, но у меня, почему-то этого не произошло. Поэтому, на всякий, запускаем принудительную установку:

xcode-select --install 

С помощью brew качаем и собираем python:

brew install --build-from-source python@3.9

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

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

brew install -s mariadb php@8.3 httpd

На этом все, вебсервер уже готов и работоспособен.

Делаем удобно- конфигурации в домашней папке

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

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

mkdir ~/MAMP
mkdir ~/MAMP/www
mkdir ~/MAMP/httpd/vhosts
mkdir /opt/homebrew/etc/httpd/vhosts/
ln -s /opt/homebrew/etc/httpd ~/MAMP/httpd
ln -s /opt/homebrew/etc/php/8.3 ~/MAMP/php

Поднастроем Apache, что бы он работал с этими директориями и включим mod_rewrite

В файле /Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/httpd/httpd.conf вносим корректировки. Можете открыть в текстовом редакторе, типа Sublime или прямо в терминале, через nano. Как по мне, удобнее в текстовом редакторе:

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

LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

Меняем прослушиваемый порт с 8080 на 80:

Listen 80

Меняем DocumentRoot на папку своего пользователя:

DocumentRoot "/Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www"
Directory "/Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www"

В самый низ этого файла добавляем:

LoadModule php_module /opt/homebrew/opt/php@8.3/lib/httpd/modules/libphp.so
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
Include /opt/homebrew/etc/httpd/vhosts/*.conf

Скрипт добавления нового сайта:

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

Создаем файл addsite.sh

nano ~/MAMP/addsite.sh

Добавляем в него следующее (комментарии внутри):

#!/bin/zsh
echo -e "Введите название проекта (Например example.local.site)";
read NAME_OF_PROJECT

# Создаем директории
mkdir ~/MAMP/www/$NAME_OF_PROJECT
mkdir ~/MAMP/www/$NAME_OF_PROJECT/public_html
mkdir ~/MAMP/www/$NAME_OF_PROJECT/logs

# Добавляем виртуальный хост
add_to_apache_conf="
<VirtualHost *:80>
 DocumentRoot "/Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www/${NAME_OF_PROJECT}/public_html"
    ServerName ${NAME_OF_PROJECT}
    ErrorLog "/Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www/${NAME_OF_PROJECT}/logs/error.log"
    CustomLog "/Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www/${NAME_OF_PROJECT}/logs/custom.log" common
</VirtualHost>
<Directory /Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www/${NAME_OF_PROJECT}/public_html>
        Options FollowSymLinks Includes
        AllowOverride All
        Order allow,deny
        Allow from all
</Directory>"
echo "$add_to_apache_conf" >> ~/MAMP/httpd/vhosts/${NAME_OF_PROJECT}.conf

# Добавляем петлю
echo "127.0.0.1 ${NAME_OF_PROJECT}" | sudo tee -a /etc/hosts

# Меняем права
sudo chmod -R 777 /Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www/$NAME_OF_PROJECT

# Рестартуем сервисы (не обязательно все, достаточно httpd и apachectl)
brew services restart httpd
sudo apachectl restart
brew services restart mariadb
brew services restart php@8.3

Делаем этот файл исполняемым:

chmod +x ~/MAMP/addsite.sh

В принципе все, теперь при запуске этого файл, будет создаваться папка с сайтом в /Users/ВАШ_ПОЛЬЗОВАТЕЛЬ/MAMP/www/ И он сразу будет открываться в браузере.

Что бы перезапускать сервисы в ручном режиме, можете использовать команды (или создать еще один .sh файл, что бы выполнять команды одним разом)

brew services restart mariadb
brew services restart php@8.3
brew services restart httpd
sudo apachectl restart

Оптимизируем под 1С-Битрикс

Тут все банально. Что бы все заработало с 1С-Битрикс, нужно внести правки в конфигурации php и mysql

Открываем файл php.ini в директории /opt/homebrew/etc/php/8.3/php.ini, находим и меняем в нем параметры:

short_open_tag = On
max_input_vars = 100000
memory_limit = 512M
upload_max_filesize = 4M
opcache.max_accelerated_files=100000
opcache.revalidate_freq=0

# Таймозону под свой часовой пояс
date.timezone = Europe/Moscow

Открываем файл my.ini в директории /opt/homebrew/etc/my.cnf , и вписываем в него параметры (их там не будет вообще):

sql_mode = ''
innodb_flush_log_at_trx_commit = 2
innodb_strict_mode = OFF
sync_binlog = 0
innodb_flush_method = O_DIRECT
transaction-isolation = READ-COMMITTED
Михаил Базаров 02.10.2024
Если возникает конфликт со встроенным в систему apache нужно его отключить
Код
$ sudo apachectl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
Евгений 10.10.2024
Инструкция хорошая, будет ли добавлена инструкция по конфигурации базы данных?
Михаил Базаров 11.10.2024
А что конкретно нужно? База данных базе данных рознь) Минимальный конфиг под битрикс в конце заметки есть

Блог-note: заметки разработчика

Основные функции вывода в шаблонах Битрикс

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

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При этом, у пользователя должна б...

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

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

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...