Облачный прокси-сервер 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_variables
INSTANCE_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.
Это обходной путь, но я не вижу возможности, если это не так.