我有一个使用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)
答案 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;
}
}
}
这是我的一台服务器的条纹版本(希望我没有任何必要的东西)。
代理服务器的主要问题是错误的标头,例如HOST
,REMOTE_ADDR
等。但是这种配置,特别是proxy_set_header
命令可以帮助大多数Web框架找出谁是真正的发送者。
答案 1 :(得分:0)
据我所知,gevent不为内置的WSGI服务器以及wsgiref提供SSL支持。
如果您希望使用gevent,可以使用“--gevent”选项查看uwsgi,但必须在app.py本身中实现WSGI入口点。我相信其余配置与apache教程中的相同。
PS:很可能uwsgi也支持SSL。