with deploy configurar and django deployment nginx subdirectories

deploy - cómo desplegar django debajo de un suburbano detrás de nginx



nginx reverse proxy django (3)

Deberá actualizar su configuración:

USE_X_FORWARDED_HOST = True FORCE_SCRIPT_NAME = /myapp

Y actualice su MEDIA_URL y STATIC_URL consecuencia.

No he tenido la experiencia de implementar bajo nginx, pero bajo apache, funciona bien. consulte: https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host

Tengo una aplicación django ejecutándose en http: // localhost: 12345 . Me gustaría que el usuario acceda a través de la URL http://my.server.com/myapp . Yo uso nginx para revertir el proxy como lo siguiente:

... ... server_name my.server.com; location /myapp { rewrite /myapp(.*) $1 break; ... ... # proxy param proxy_pass http://localhost:12345; } ... ...

La pregunta es, cuando se configura como el anterior, cómo hacer que las direcciones URL en mis páginas de respuesta tengan un prefijo de "/ myapp" para que el nginx pueda dirigirlas correctamente a myapp. Por ejemplo, las URL en una página como "/ foo / far" deberían cambiarse a "/ myapp / foo / bar" para permitir el proxy nginx a myapp. ¿Cuál es la configuración correcta de nginx para usar para lograr esto?

Puedo usar las variables de configuración de django para especificar el prefijo raíz url, pero no es flexible para mi mente, ya que la variable debe ser modificada de acuerdo a la configuración nginx diferente (digamos que un día nginx puede cambiar el suburbano de "/ myapp" a " / anotherapp ").


Aquí hay una parte de mi configuración para nginx que, sin embargo, no configura FORCE_SCRIPT_NAME, pero entonces, no estoy usando un subdirectorio. Tal vez sea útil para establecer opciones relacionadas con USE_X_FORWARDED_HOST en nginx en lugar de Django.

upstream app_server_djangoapp { server localhost:8001 fail_timeout=0; } server { listen xxx.xxx.xx.xx:80; server_name mydomain.com www.mydomain.com; if ($host = mydomain.com) { rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent; } ... location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://app_server_djangoapp; break; } } ... }


Como el prefijo está establecido en Nginx, el servidor web que aloja la aplicación Django no tiene forma de conocer el prefijo de la URL. Como dijo orzel, si usaba apache + mod_wsgi incluso de nginx + gunicorn / uwsgi (con alguna configuración adicional), podría usar el valor WSGIScriptAlias, que Django lee automáticamente.

Cuando necesito usar un prefijo de URL, generalmente lo ubico en mi raíz urls.py, donde tengo solo una línea, prefijada por el prefijo e incluyendo otra urls.py

(r''^/myapp/'', include(''myapp.urls'')),

Pero supongo que esto tiene el mismo cuello de botella que establecer un prefijo en settings.py, tienes una configuración redundante en nginx y Django.

Debe hacer algo en el servidor que aloja su aplicación Django en: 12345. Puede establecer el prefijo allí y pasarlo a Django usando WSGIScriptAlias ​​o su equivalente externo mod_wsgi. No puedo darle más información ya que no sé cómo se ejecuta su aplicación Django. Además, tal vez deberías considerar ejecutar tu aplicación Django directamente desde Django, usando uWSGI o gunicorn.

Para pasar el prefijo a Django desde el servidor web, puede usar esto:

proxy_set_header SCRIPT_NAME /myapp;

Más información aquí