Автор оригинала: Lionel Martin.
Как консультант, мои клиенты часто спрашивают меня, стоит ли портировать свое веб-приложение в веб-сервисы Amazon. Они ожидают лучших производительности и надежности, потому что AWS звучит более профессионально, но они также услышали истории о ужасах AWS счета, хотя они не уверены, почему.
Краткий ответ — это, архитектуру веб-платформы правильно, вы сможете не только развернуть на более дешевом варианте хостинга, но также обеспечить плавную миграцию, чтобы спуститься по дороге, гарантировано нулевое рефакторирование.
Длинный ответ — это почему я пишу этот пост! В остальной части поста я предложу обширный контрольный список, который гарантирует вашу веб-платформу для портативов и позволить вам максимально использовать AWS.
1. Конфигурация как переменные среды
Первое, что я проверил во время аудита, является ли настройка приложения из переменных среды. Окружающая среда везде, где ваше приложение может быть запущено. Это может быть локальные машины вашего разработчика, ваши тестирующие серверы, ваши постановки серверы или ваши производственные серверы.
Конфигурация приложения — это все, что может измениться между средами.
- Ресурс обрабатывает для поддержки служб (URI в базу данных, кэш-механизм, поисковая система и т. Д.)
- Любые учетные данные для внешних служб (пароли, SSH-ключи, сертификаты SSL)
Получить вашу конфигурацию из предопределенных файлов …
… и файлы конфигурации должны быть инициализированы из переменных среды.
В PHP Laravel это может быть достигнуто путем создания файлов в config . Папка и инициализация файлов конфигурации с переменными среды, используя помощник env () Отказ
И инициализируйте свои файлы конфигурации из среды
Конфигурация специальной среды не должна быть в исходном коде, а скорее сохранена в среде.
На вашем тесте, постановке и производственных серверах окружающая среда устанавливается вашими сценариями развертывания.
На локальных машинах разработчика и для каркаса Laravel она хранится как файл .env в корне проекта, который никогда не должен быть привержен для репозитория исходного кода (добавьте его в файл .gitignore файл) Отказ
Конфигурация для ваших тестовых трубопроводов может быть сохранена в .env.testing файл.
Пахнуть тестом
Любой код, который тестирует окружающую среду, является красным флагом ( IFS производство Тогда … / Если Постановка Тогда ). Когда локальные и производственные и постановка используют разные драйверы (например, машины Dev DEV хранят файлы локально, в то время как производственный сервер использует службу хранения файлов), необходимо использовать уровень абстракции. С этим сказанным, он не должен быть смешан в коде с вашим приложением бизнес-логикой.
Larave предлагает услуги фасады для Хранение , Кэш , Очередь И т. Д. И т. Д. Их роль состоит в том, чтобы сделать абстракцию того, как хранение файлов, кэш, справочная задания в очереди и т. Д. Достигнута, поэтому логика не зависит от среды, и поэтому ваш код должен быть.
Это так, один и тот же код будет использовать локальный сервер Redis для хранения веб-сеансов и управляемой уластичной службы на AWS.
При развертывании вашего кода не будет выключения последнего коммутатора, а не ошибка в последнюю минуту.
2. Код без гражданства
Приложение ACATESTALSE — это прикладная программа, которая не записывает данные, сгенерированные в одном сеансе — например, как информация о пользовательских настройках и событиях, которые произошло — для использования на следующей сессии с этим пользователем.
Конечно, ваше приложение не будет без гражданства! Если вы создадите веб-платформу, вы обычно хотите, чтобы ваши пользователи могли создавать как можно больше данных на вашем обслуживании.
Но его процессы должны быть без гражданства, в том смысле, что перераспределение, разбивающие или балансирование нагрузки пользователя на разные серверы не должны влиять на пользователя.
Это достигается путем централизации хранения только в задневских сервисах, а не на серверах приложений. Сохраняя свои сеансы в Управляемом сервисе Redis (например, AWS Elasticache), сохраняя ваши пользовательские файлы в службе хранения файлов (например, AWS S3), и выполнение базы данных в экземпляре управляемых AWS RDS, вы убедитесь, что передислокация на одном сервере приложений Не прерывайте сеансы ваших пользователей.
Это также означает, что вы можете загрузить баланс вашего трафика на нескольких серверах приложений, и ваши пользователи всегда смогут найти свои файлы. Они найдут их даже после того, как развертывание не удалось, и они теряют сервер.
Запах-тест: код с использованием локальных файлов, локальная память
Приложение PHP, которое хранит файлы на локальном сервере, он работает на другом красный флаг. Если вы потеряли этот сервер на следующем перераспределении, вы потеряете пользовательские данные. Такое приложение не будет готово к масштабированию и потребуется рефакторинг тоже.
Jwt.
Для пользовательских сеансов и токенов API Oauth вы можете даже обрабатывать данные сеанса пользователей без централизованного магазина ключа-значений или использования базы данных. Используя JSON Web Tokens вместо случайных токенов OAUTH, приложение полагается на клиент (браузер) для хранения и отправки всей этой информации обратно. Данные зашифрованы серверной стороной, чтобы избежать вмешательства и может храниться в файле cookie. В этом случае серверы ничего не хранят (или просто черный список для отзыва), а процессы приложений не придется ничего поделиться или позвонить в задней части.
3. Разрешить параллелизм
Теперь, когда ваше приложение является бездействием, немедленная выгода в том, что вы можете запустить несколько версий IT, на разных серверах. Это известно как Горизонтальное масштабирование , как противопоставляется вертикальному масштабированию, которое означало бы сохранение и управление приложением на одном сервере и обновить его на более мощный при необходимости.
Не все программное обеспечение может быть горизонтально масштабировано (например, это было бы сложной проблемой для баз данных или поисковых систем), но, только следуя 6 баллов в этом руководстве, вы можете сразу же горизонтально масштабировать приложения PHP.
После того, как ваше приложение не является беззвененным, следующим шагом является разделение переднего кода к фоновым задачам. Веб-процессы — это процессы, которые немедленно отвечают на запросы браузеров ваших пользователей.
Вы также можете иметь фоновые задания (например, отправка отчетов, генерирующие счета, данные о хрустях, отправлять уведомления по электронной почте/Push). Они должны быть выполнены за пределами ваших веб-процессов, даже когда они также написаны в PHP.
Эти рабочие места должны быть выполнены рабочие процессы, чтобы не блокировать веб-запросы.
В рамках Laravel используйте фасад очередей и сервера очереди сообщений, как Redis для отправки этих блокирующих задач до отдельного пула серверов. Когда вы мигрируете в AWS, вы можете использовать SQS-сервис по очереди управляемого сообщения.
Предупреждение: Если вы используете AWS SQS, чтобы запланировать критические задачи, вам нужно знать о Дублирующее сообщение Креажи к краю, как описано buffer.com В этом посте Отказ
4. Журналы как потоки, а не файлы
Также как сгенерированные пользователем файлы не должны храниться локально на вашем сервере приложений, журналы также не должны храниться локально. Они должны быть централизованы и транслируются на внутренний сервис, где вы найдете все журналы со всех ваших серверов приложений в одном месте (даже с серверов, которые вы потеряли или сняли).
Фасад Larave Facade только хранит в журналах в файлах по умолчанию, поэтому вам понадобится Пользовательская настройка Вместо этого транслируйте их в стандартную ошибку PHP. Если вы используете свое приложение PHP внутри Docker, вы можете использовать драйвер CloudWatch AWS и поток ваших журналов в одно централизованное место.
Пахнуть тестом
Любой журнал, записанный в локальный файл на производственном сервере.
5. Горизонтальное масштабирование, без рефакторинга
Если вы следили за всеми пунктами выше, поздравляю! Ваше веб-приложение готово к масштабированию, без рефакторинга не требуется.
Разделяя конфигурацию из кода, приложение становится портативным от более дешевого провайдера хостинга для AWS.
Отправка заблокированных задач к фоновым работникам процессов позволяет нам разгрузить интерфейс и масштабировать ее независимо к процессам рабочих. Запустив нашу приложение в качестве процессов бездействия, мы можем загрузить баланс трафика наших пользователей на разные серверы и хранить данные в Backend-Services.
Это предпосылки для горизонтального масштабирования. Это экономически эффективно, потому что вы можете масштабировать с меньшими менее дорогими серверами.
Следующим шагом является выступление ваших бэк-конечных услуг также экономически эффективно.
6. Регистрация Управляемых услуг AWS
До сих пор мы говорили только о серверах приложений (где ваши HTTP-серверы отвечают на веб-запросы, выполнив свой PHP-код), поэтому как насчет задних сервисов, базы данных, поисковой системы и так далее?
Вот где вы можете максимально использовать AWS. Все эти задневские сервисы существуют как Управляемые услуги На AWS, I.e. Pay-As-You-Go — Биллинг без сервера для вас для обслуживания.
Вы хотите максимально использовать эти услуги для базы данных (AWS RDS, DocumentDB), хранилище файлов (S3), хранилище сеансов (эластикаческую боль), агрегация журналов (CloudWatch), кэш-механизм, поисковая система (AWS управляемый Elasticsearch), а также Балансировка нагрузки.
Заключение
Так что же с экономической эффективностью?
Управляемые услуги стоят гораздо меньше на практике, чем запуск собственных серверов. Они более безопасны и могут быть масштабированы за несколько кликов. Сохранение ваших пользовательских файлов на AWS S3 стоит около 0,02 доллара за RU в месяц после передачи 15 ГБ в месяц и является Бесплатно до этого.
Хостинг вашей поисковой системы на AWS Elasticsearch Управляемая услуга — Бесплатно для меньшего примера.
Есть много примеров, с которыми я могу придумать, но я думаю, что вы получите точку зрения.
Что еще более важно, управляемые сервисы занимают гораздо меньшее время для настройки и требуют практически нулевого времени для обслуживания, которые могут определенно получить вам лучшую ночь сна.
Я надеюсь, что этот пост был полезен для вас! Если у вас есть какие-либо вопросы отзывов, не стесняйтесь оставить комментарий ниже!
Этот пост был первоначально опубликован автором здесь . Эта версия была отредактирована для ясности и может появиться отличаться от исходного поста.
Оригинал: «https://www.codementor.io/@lionel/6-must-do-before-hosting-your-laravel-web-platform-on-aws-a5zrbfs3s»