2017-01-30 1 views
4

Мы запускаем экземпляр Metabase на гибком пользовательском времени выполнения App Engine с файлом Docker на основе openjdk: 8. В настоящее время он разрешает доступ на http://[metabase-project].appspot.com/ и https://[metabase-project].appspot.com/. Я хотел бы заставить SSL, указав все http-трафик на https.Форсирование SSL на гибком окружении App Engine Пользовательское время выполнения

Dockerfile выглядит примерно так:

FROM openjdk:8 
ADD https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 ./cloud_sql_proxy 
ADD http://downloads.metabase.com/v0.21.1/metabase.jar ./metabase.jar 
CMD ./cloud_sql_proxy -instances=$INSTANCE=tcp:$MB_DB_PORT -dir=/cloudsql & java -jar ./metabase.jar 

Наш app.yaml выглядит как:

service: metabase 
runtime: custom 
env: flex 

В обычном App Engine app.yaml файл, я хотел бы добавить:

handlers: 
- url: [something] 
    secure: always 

Но в пользовательской среде выполнения мы не имеем доступа к обработчикам вроде этого. Есть ли способ настроить гибкую среду выполнения для выполнения перенаправления для всего трафика?

+0

ли ваш домен переадресацию предложение поставщика домена? Вы можете перенаправить все 'http:' в 'https:' – GAEfan

+1

@GAEfan, это применимо только к настраиваемому домену, а субдомен проекта appspot.com разрешит HTTP без пересылки, правильно? –

+1

Правильно, он будет работать только для настраиваемого домена. Я не знаю о встроенном для домена appspot. Возможно, вам придется протестировать заголовок запроса для 'https' и принудительно перенаправить свои запросы для не-https-запросов. – GAEfan

ответ

2

Поскольку ваше приложение (env: flex в app.yaml) работает позади Nginx обратный прокси-сервер, который прекращает соединение SSL, необходимо проверить X-FORWARDED-PROTO заголовок, который будет либо http или https. Если это http, вы можете сделать переадресацию.

+0

У меня создается впечатление, что у меня нет возможности изменять конфигурацию nginx (http://stackoverflow.com/questions/40853799/is-there-a-way-to-customize-nginx-proxy-in- Google гибкий-AppEngine). Я использую Metabase, который явно решил, что это должно поддерживаться платформой хостинга, а не их инструментами. У них есть конфигурация для ЭБ, которая правильно настраивает перенаправление (https://github.com/metabase/metabase/issues/1356), но, похоже, на appengine flex нет возможности. –

+0

Поскольку Metabase кажется открытым исходным кодом, технически его можно расширить. :) – zengabor

+0

Подтвердите, что заголовок «X-Forwarded-Proto» присутствует сегодня и «http» или «https». –

2

Это то, что сработало для меня. В моем случае с использованием приложения NodeJS на основе Loopback, работающего в среде Cloud Sites App Engine.

  1. Создать промежуточное программное обеспечение, например server/middleware/https-redirect.js со следующим кодом:

    /** 
    * Create a middleware to redirect http requests to https 
    * @param {Object} options Options 
    * @returns {Function} The express middleware handler 
    */ 
    module.exports = function(options) { 
        options = options || {}; 
        var httpsPort = options.httpsPort || 443; 
        return function(req, res, next) { 
        if (req.protocol != 'https' && process.env.NODE_ENV !== 'development') { 
         var parts = req.get('host').split(':'); 
         var host = parts[0] || '127.0.0.1'; 
         return res.redirect('https://' + host + ':' + httpsPort + req.url); 
        } 
        next(); 
        }; 
    }; 
    

    (основано на шаге 8 в пост http://www.jonxie.com/blog/2014/11/12/setting-up-loopback-to-use-https-and-ssl-certificates/, но изменен, чтобы использовать req.protocol вместо req.secure, также будет только перенаправить если не работает в режиме разработки)

  2. Изменить файл server/server.js на запрос:

    var httpsRedirect = require('./middleware/https-redirect'); 
    
  3. затем, после загрузки линии:

    var httpsPort = app.get('https-port'); 
    app.use(httpsRedirect({httpsPort: httpsPort})); 
    app.set('trust proxy', true) 
    

Установка app.set('trust proxy', true) пустит req.protocol прочитать заголовок X-Forwarded-Proto.

Ссылки:

Смежные вопросы