Облачный прокси-сервер GAE использует TCP-сокеты (вместо UNIX)

Мы настраиваем приложение узла на GAE, и одна из библиотек, которую мы используем, не очень хорошо работает с сокетами Unix.

В настройке Cloud Proxy внутри GAE используются сокеты Unix, я гуглил и искал в документах Google, но не могу найти информацию о настройке облачного прокси, созданного в GAE (т. Е. В производстве), для использования сокетов TCP.

(Я сделал это локально при тестировании, но не могу понять, что мне нужно установить в моем app.yaml, чтобы это произошло в производстве)

1 ответ

Решение

Чтобы иметь возможность использовать TCP-сокеты в вашем приложении, вы должны перейти на Custom Runtime.

Вы можете создать Dockerfile с помощью команды

$ gcloud beta app gen-config --custom

После создания Dockerfile для этой среды выполнения измените его следующим образом:

FROM gcr.io/google_appengine/nodejs
RUN /usr/local/bin/install_node '>=4.3.2'
RUN apt-get update
RUN apt-get install mysql-client -yy
RUN apt-get install wget -yy
COPY . /app/
RUN npm install --unsafe-perm || \
  ((if [ -f npm-debug.log ]; then \
      cat npm-debug.log; \
    fi) && false)
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
RUN chmod +x cloud_sql_proxy
RUN echo -e “#!/bin/bash\n./cloud_sql_proxy -instances=YOUR-INSTANCE-DB=tcp:3306 &\nnode server.js” > script.sh
RUN chmod +x script.sh
CMD bash script.sh

Это при развертывании сгенерирует контейнер, и у этого контейнера будет прокси, взаимодействующий через TCP.

Перед развертыванием в вашем app.yaml файл, из которого вы должны удалить env_variablesINSTANCE_CONNECTION_NAME, как вы уже указываете, что в Dockerfile.

Не забудьте включить Cloud SQL API для запуска этого.

Я использовал пример здесь, и вы можете видеть, что функция connect в server.js имеет условие if, подобное этому:

if (process.env.INSTANCE_CONNECTION_NAME && process.env.NODE_ENV === 'production') {
    config.socketPath =/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}
}

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

Это обходной путь, но я не вижу возможности, если это не так.

Другие вопросы по тегам