Я использую стандартную среду Google App Engine для своего приложения NodeJs. Все работало нормально, пока я не зарегистрирую маршрут '/ *' в своем экспресс-приложении, чтобы перехватить все маршруты после моих начальных маршрутов, таких как '/', '/ login' и т. д. После развертывания моего приложения в GAE я получил:
Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
В моих журналах сборки App Engine:
Мой app.yaml выглядит так:
app.yaml
runtime: nodejs10
env: standard
service: default
health_check:
enable_health_check: False
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
Цитата из официальных документов GAE: https://cloud.google.com/appengine/docs/standard/nodejs/how-instances-are-managed
Startup Each service instance is created in response to a start request, which is an empty HTTP GET request to /_ah/start. App Engine sends this request to bring an instance into existence; users cannot send a request to /_ah/start. Manual and basic scaling instances must respond to the start request before they can handle another request. The start request can be used for two purposes:
To start a program that runs indefinitely, without accepting further requests. To initialize an instance before it receives additional traffic. Manual, basic, and automatically scaling instances startup differently. When you start a manual scaling instance, App Engine immediately sends a /_ah/start request to each instance. When you start an instance of a basic scaling service, App Engine allows it to accept traffic, but the /_ah/start request is not sent to an instance until it receives its first user request. Multiple basic scaling instances are only started as necessary, in order to handle increased traffic. Automatically scaling instances do not receive any /_ah/start request.
When an instance responds to the /_ah/start request with an HTTP status code of 200–299 or 404, it is considered to have successfully started and can handle additional requests. Otherwise, App Engine terminates the instance. Manual scaling instances are restarted immediately, while basic scaling instances are restarted only when needed for serving traffic.
Я что-то упускаю? Пожалуйста помоги.
Заранее спасибо





Возможно, вы захотите пройти через Файл конфигурации app.yaml, у вас есть несколько конфигураций, которые не поддерживаются (некоторые из них - применимо только к гибкой среде) или просто избыточны в вашей среде и не влияют на ваше приложение:
env: standard
service: default
health_check:
enable_health_check: False
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
Из них ресурсы мог бы актуальны, вам, кажется, требуется 0,5 ГБ памяти для вашего приложения. Для этого вам понадобится конфигурация instance_class, выбрав хотя бы класс B4. В противном случае ваше приложение получит только B2 (с 256 МБ памяти). Из Элементы среды выполнения и приложения:
Default: B2 is assigned if you do not specify an instance class along with the basic_scaling element or the manual_scaling element.
Но это всего лишь подозрение. Возможно, вы захотите откопать фактический журнал ошибок, соответствующий 500 err для запроса /_ah/start, надеюсь, он сможет точно определить основную причину сбоя (множество возможностей, недостаточная память - лишь одна из них). Без него это просто догадки.
Боковое примечание - потенциально интересно: Как определить, относится ли страница документации Google App Engine к стандартной или гибкой среде
ЦП и память - допустимые параметры: cloud.google.com/appengine/docs/f flexible/python/reference/…
Я решил эту проблему, зарегистрировав свой последний маршрут следующим образом:
app.get(/^(?!.*_ah).*$/,(req,res,next)=>{
})
по сравнению с моей предыдущей конфигурацией.
app.get('/*',(req,res,next)=>{
})
Здесь я использовал отрицать регулярное выражение. Кредит на этот SO-ответ
Цитата из официальных документов GAE
To initialize an instance before it receives additional traffic. Manual, basic, and automatically scaling instances startup differently. When you start a manual scaling instance, App Engine immediately sends a /_ah/start request to each instance.
Что делает вышеупомянутый обработчик маршрута, так это перехват всех маршрутов, кроме маршрута, начинающегося с _ah, что означает, что _ah / start и _ah / stop не будут прослушиваться моим приложением, поскольку они используются движком Google App для регистрации приложения.
Надеюсь, это кому-то поможет в будущем.
Спасибо
Я использовал хак для отрицания регулярного выражения в моем обработчике маршрута для маршрутов _ah, хотя я внес рекомендуемые изменения в файл конфигурации app.yaml.