Cherrypy NGINX ошибка: 403 индекс каталога / некоторые / путь запрещен - PullRequest
1 голос
/ 18 октября 2019

Я использую NGINX на сервере Ubuntu 18.04 x64 Digital Ocean. У меня есть приложение Cherrypy, работающее непосредственно на сервере Ubuntu. Я пытаюсь использовать NGINX для proxy_pass к моему приложению Cherrypy для определенного маршрута. Proxy_pass, кажется, работает, но я получаю 403 Запрещенную ошибку, когда я пытаюсь POST к маршруту. Маршрут Cherrypy работает с POST-запросами Python, когда я тестирую его локально, но не работает, когда я отправляю запрос через NGINX с proxy_pass.

Cherrypy находится в виртуальной среде Pipenv. Чтобы запустить его, я запускаю Python3 app.py.

Вот ошибка в журнале ошибок NGINX:

2019/10/17 20:51:50 [error] 29574#29574: *51 directory index of "/mnt/media_storage/media_root/media/monday/monday-file-upload/" is forbidden, client: 73.14.140.118, server: media.bscs.org, request: "GET /monday/monday-file-upload/ HTTP/1.1", host: "media.bscs.org"

Вот моя конфигурация NGINX:

# Microcaching
proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;

# Cache in browser
# Expires map
map $sent_http_content_type $expires {
    default                     off;
    text/html                   epoch;
    text/css                    30d;
    application/javascript      30d;
    ~image/                     30d;
}

upstream apps {
    server 127.0.0.1:8080;
}

server {
  listen 80;
  listen [::]:80;
  server_name media.bscs.org;
  rewrite ^/(.*) https://media.bscs.org/$1 permanent;
}

server {
  listen *:443 ssl http2;
  listen [::]:443 ssl http2;
  server_name media.bscs.org;

  root /mnt/media_storage/media_root/media;
  charset utf-8;

  client_max_body_size 1000M;

  # Gzip/compress text-based assets
  gzip on;
  gzip_http_version 1.0;
  gzip_vary on;
  gzip_comp_level 6;
  gzip_proxied any;
  gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml text/javascript application/javascript image/svg+xml;
  gzip_disable "MSIE [1-6]\.";

  # make sure gzip does not lose large gzipped js or css files
  # see http://blog.leetsoft.com/2007/7/25/nginx-gzip-ssl
  gzip_buffers 16 8k;

  # Microcaching
  proxy_cache cache;
  proxy_cache_valid 200 1s;

  # Cache in browser
  expires $expires;

  ssl on;
  ssl_ciphers "my-cipher";
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

  ssl_session_cache shared:SSL:10m;

  add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";


  add_header X-Content-Type-Options nosniff;
  add_header 'Access-Control-Allow-Origin' '*';

  ssl_session_tickets off;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver_timeout 5s;
  ssl_certificate /etc/nginx/ssl/cert_chain.crt;
  ssl_certificate_key /etc/nginx/ssl/STAR.bscs.org.key;
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;

  location = /favicon.ico {
    access_log off;
    log_not_found off;
    sendfile on;
    sendfile_max_chunk 1m;
  }

  location ~* \.(gif|jpg|jpeg|png|js|css)$ {
        log_not_found off;
        access_log off;
        sendfile on;
        sendfile_max_chunk 1m;
  }

  location /media/ {
    alias /mnt/media_storage/media_root/media/;

    location /media/monday/monday-file-upload/ {
      alias /mnt/media_storage/media_root/media/monday/monday-file-upload/;

      proxy_pass        http://apps/;
      proxy_redirect    off;
      proxy_set_header  Host $host;
      proxy_set_header  X-Real-IP $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Host $server_name;
    }
  }

  # Redirects
  rewrite ^/tech-report/2018-1/2018-1.html$ https://bscs.org/resources/reports/designing-citizen-science-for-both-science-and-education-a-workshop-report/$1 permanent;

}

Вот мой постзапрос с запросами Python:

def uploadFileToMediaServer(uploaded_file_local_path):
  with open(uploaded_file_local_path, 'rb') as f:
      files = {'uploaded_file': f}

      r = requests.post('https://media.bscs.org/monday/monday-file-upload', files=files)
      print(r.request.url, file=sys.stderr)
      print(r.request.headers, file=sys.stderr)

      return r

Вот мое приложение Cherrypy:

import cherrypy
from cherrypy.process.plugins import Daemonizer

config = {
    'global': {
        'server.socket_host': '127.0.0.1',
        'server.socket_port': 8080,
        'server.thread_pool': 8,
        'server.max_request_body_size': 0,
        'server.socket_timeout': 60
    }
}

class App:
    @cherrypy.expose
    def index(self, uploaded_file):
        try:
            with open('../uploads/{}'.format(uploaded_file.filename), 'wb') as f:
                while True:
                    data = uploaded_file.file.read(8192)
                    if not data:
                        return {'message': 'File failed to upload'}
                    f.write(data)

            return {'message': 'File uploaded successfully'}
        except Exception:
            cherrypy.log(Exception, traceback=True)


if __name__ == '__main__':
    d = Daemonizer(cherrypy.engine)
    d.subscribe()

    cherrypy.tree.mount(App(), "/", config)
    cherrypy.engine.start()
    cherrypy.engine.block()
...