Pyramidのリソースを別ドメインで公開したい

Pyramidでリソーストラバーサルベースのアプリケーションを使っていると、あるリソース配下のものだけ別ドメインで公開したいということがあります。それぞれのブログリソースをそれぞれ別のドメインで公開したい、とかですね。

/(Root, http://manage.blog.com/)
|
+-blog1(Blog, https://blog1.com/)
| |
| +entry1(Entry)
|
+-blog2(Blog, https://blog2.com/)

blog1とblog2をそれぞれ別ドメインで公開したいときはリバースプロクシを併用すれば実現できます。

Virtual Root

Virtual Root Support

PyramidにはX-Vhm-Rootヘッダに指定された絶対パスのリソースをRootとみなす機能があります。Nginxでblog1を別ドメインでの公開はこのようになります。

daemon off;
http {
    server {
        server_name blog1.com;

        location / {
            proxy_pass http://manage.blog.com/;
            proxy_set_header X-Vhm-Root /blog1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
events {
}

HTTPSを伝える

Virtual Rootを設定したときに忘れがちですがPyramidを含むWebアプリケーションフレームワークで、スキーマ込みのURLを生成するときにhttpかhttpsかは重要な要素です。 NginxからX-Forwarded-Protoヘッダで伝えましょう。

daemon off;
http {
    server {
        server_name blog1.com;

        location / {
            proxy_pass http://manage.blog.com/;
            proxy_set_header X-Vhm-Root /blog1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            # httpsを伝える
            proxy_set_header X-Forwarded-Proto https;
        }
    }
}
events {
}

WSGIサーバがWaitressのときは trusted_proxy の設定も必要になります。 詳細や他の方法については Using Behind a Reverse Proxy を参照してください。