gevent开放转移强制HTTP

2024-10-02 04:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网页.py使用python2.7社区购物车通过gevent运行在OpenShift上的应用程序。我想强制所有连接都通过https。有一个很好的关于OpenShift的教程可以用apache来实现,但是对于gevent呢?在

这是我的应用程序,它基本上是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)

Tags: runimportipappserverapplicationosport
2条回答

我建议使用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框架确定谁是真正的发送者。在

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

如果您希望使用gevent,可以使用“gevent”选项查看uwsgi,但是您必须在应用程序副本本身。我相信rest配置与apache教程中的配置相同。在

PS:很可能uwsgi也支持SSL。在

相关问题 更多 >

    热门问题