gevent Open Shift强制HTTPS

时间:2013-12-02 00:34:09

标签: python https web.py openshift gevent

我有一个使用Python 2.7社区推车通过gevent在OpenShift上运行的web.py应用程序。我想强制所有连接通过https。有一个很好的OpenShift教程可以用apache来做这个,但是gevent呢?

这是我的app.py,它基本上是Python 2.7社区推车中的默认设置:

#!/usr/bin/env python
import imp
import os
import sys

try:
   zvirtenv = os.path.join(os.environ['OPENSHIFT_PYTHON_DIR'],
                           'virtenv', 'bin', 'activate_this.py')
   execfile(zvirtenv, dict(__file__ = zvirtenv) )
except IOError:
   pass


def run_gevent_server(app, ip, port=8080):
   from gevent.pywsgi import WSGIServer
   WSGIServer((ip, port), app).serve_forever()


def run_simple_httpd_server(app, ip, port=8080):
   from wsgiref.simple_server import make_server
   make_server(ip, port, app).serve_forever()


if __name__ == '__main__':
   ip   = os.environ['OPENSHIFT_PYTHON_IP']
   port = int(os.environ['OPENSHIFT_PYTHON_PORT'])
   zapp = imp.load_source('application', 'wsgi/application')
   #  Use gevent if we have it, otherwise run a simple httpd server.
   print 'Starting WSGIServer on %s:%d ... ' % (ip, port)
   try:
      run_gevent_server(zapp.application, ip, port)
   except:
      print 'gevent probably not installed - using default simple server ...'
      run_simple_httpd_server(zapp.application, ip, port)

2 个答案:

答案 0 :(得分:1)

我建议使用nginx终止SSL(https)连接和代理请求到您的应用程序。这是简单的nginx配置

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    access_log  /var/log/nginx/access.log  main;

    upstream app_server {
        server 127.0.0.1:5001 fail_timeout=0;  
    }

    server {
        listen <OPENSHIFT_PYTHON_IP>:<OPENSHIFT_PYTHON_PORT>;
        server_name <DOMAIN_NAME>;

        ssl                 on;
        ssl_protocols       SSLv3 TLSv1;
        ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate     /etc/nginx/cert.crt;
        ssl_certificate_key /etc/nginx/cert.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_redirect off;

            proxy_pass http://app_server;
        }
    }
}

这是我的一台服务器的条纹版本(希望我没有任何必要的东西)。

代理服务器的主要问题是错误的标头,例如HOSTREMOTE_ADDR等。但是这种配置,特别是proxy_set_header命令可以帮助大多数Web框架找出谁是真正的发送者。

答案 1 :(得分:0)

据我所知,gevent不为内置的WSGI服务器以及wsgiref提供SSL支持。

如果您希望使用gevent,可以使用“--gevent”选项查看uwsgi,但必须在app.py本身中实现WSGI入口点。我相信其余配置与apache教程中的相同。

PS:很可能uwsgi也支持SSL。