2015-01-10 1 views
1

У меня проблема с сервером прокси-сервера Apache и Django SSL: следующая ошибка, за которой следуют параметры Django settings.py и apache server.conf для SSL, django version 1.6 .8Django Apache SSL [код 400, неверный запрос сообщения]

---------------------------------------- 
    [10/Jan/2015 09:11:33] code 400, message Bad request syntax ('\x16\x03\x00\x00? 
    Exception happened during processing of request from ('5.5.0.46', 38141) 
    Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 126, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__ 
    self.handle() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 117, in handle 
    if not self.parse_request(): # An error code has been sent, just exit 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 286, in parse_request 
    self.send_error(400, "Bad request syntax (%r)" % requestline) 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 368, in send_error 
    self.send_response(code, message) 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 385, in send_response 
    self.log_request(code) 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 422, in log_request 
    self.requestline, str(code), str(size)) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 138, in log_message 
    msg = "[%s] %s\n" % (self.log_date_time_string(), format % args) 
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xf9 in position 12: ordinal not in range(128) 
    ---------------------------------------- 

settings.py

...... 

    # secure proxy SSL header and secure cookies 
    SECURE_SSL_REDIRECT = True 
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 
    SESSION_COOKIE_SECURE = True 
    CSRF_COOKIE_SECURE = True 

    # session expire at browser close 
    SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

    # wsgi scheme 
    os.environ['wsgi.url_scheme'] = 'https' 
    ...... 

апач server.conf

<IfModule mod_ssl.c> 
    <VirtualHost *:80> 
      ServerName mywebsite.com 
      WSGIScriptAlias//var/www/manage/manage/wsgi.py 
    </VirtualHost> 
    <VirtualHost _default_:443> 
      ServerName mywebsite.com 
      WSGIScriptAlias//var/www/manage/manage/wsgi.py 
      SSLEngine on 
      SSLCertificateFile  /etc/apache2/ssl/apache.crt 
      SSLCertificateKeyFile /etc/apache2/ssl/apache.key 
      redirect permanent/https://5.5.0.38:8080 
    </VirtualHost> 
    </IfModule> 

Также я включен HTTPS в Джанго wsgi.py

...... 
    os.environ['HTTPS'] = "on" 
    .............. 

ответ

1

Плохой запрос синтаксис ('\ x16 \ x03 \ x00 \ x00?

Это HTTPS-трафик, в котором ожидается HTTP-трафик. Я предполагаю, что это вызвано следующей строкой в ​​apache.conf:

redirect permanent/https://5.5.0.38:8080

Это указывает браузеру доступ к данному URL (возможно, ваш сервер Django) вместо этого. Он не перенаправляет запрос на сервер Django (что вы, вероятно, предполагали), а вместо этого инструктирует браузер сделать новый запрос и получить ресурс непосредственно с сервера Django, который не имеет apache впереди. Я думаю, вам нужно использовать вместо этого что-то вроде ProxyPass или ProxyPassReverse, если вы хотите использовать apache перед другим сервером.

Было бы очень необычно, если порт 8080 фактически используется для https, обычно это используется только для http. Поэтому я предполагаю, что ваш сервер Django сам по себе просто говорит просто http.

os.environ [ 'HTTPS'] = "на"

Это не делает сервер HTTPS из Джанго, но он указывает только Django создать все ссылки как HTTPS ссылки. Это подтверждает мое предположение, что ваш сервер Django делает только простой http.

+0

я необходимо перенаправить запросы HTTPS с сервера apache на сервер Django и вернуть их обратно на тот же порт 443 – aabdulwahed

+0

в порядке, после включения модуля proxy_http и добавления файла Proxypassreverse в proxy.conf он работает, но у меня есть проблема с получением ресурсов как файлы js/css/и изображений Failed для загрузки ресурса: сервер ответил статусом 502 (прокси-ошибка), поэтому как я могу сохранить все запросы и получить все ресурсы без получения этого сообщения об ошибке – aabdulwahed

+0

спасибо, просмотрев файл proxy.conf, я модифицировал ProxyPassReverse/http://5.5.0.38:8080/ вместо ProxyPassReverse/http://5.5.0.38:8080, слэш '/' делает эту ошибку – aabdulwahed

1

Я думаю, что правильный ответ заключается в следующем:

  • первого включения модуля proxy_http для апача переназначить URL с HTTPS на HTTP

    $ a2enmod proxy_http

  • второй удалить перенаправление https-запросов на django

  • Добавить ProxyPass и ProxyPassReverse для передачи запроса https s от сервера apache до Django по протоколу http

    следующее, что я сделал для apache.конф

    <VirtualHost *:80> 
          ServerName mywebsite.com 
          WSGIScriptAlias//var/www/manage/manage/wsgi.py 
        </VirtualHost> 
        <VirtualHost _default_:443> 
          ServerName mywebsite.com 
          WSGIScriptAlias//var/www/manage/manage/wsgi.py 
          SSLEngine on 
          SSLCertificateFile  /etc/apache2/ssl/apache.crt 
          SSLCertificateKeyFile /etc/apache2/ssl/apache-wp.key 
          ProxyPass/http://myip:8080/ 
          ProxyPassReverse/http://myip:8080/ 
          #redirect permanent/https://myip:8080 
        </VirtualHost> 
    

также убедитесь, что все HTTP переписан на HTTPS редактировать /etc/apache2/sites-enabled/000-default.conf апачский файл, как показано ниже

<VirtualHost *:80> 
     ServerAdmin [email protected] 
     DocumentRoot /var/www/html 
     RewriteEngine On 
     RewriteCond %{HTTPS} !on 
     RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 
     ErrorLog ${APACHE_LOG_DIR}/error.log 
     CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 
Смежные вопросы