Use nginx to serve static files
This should keep easy requests out the app event loop, hopefully improving response time
This commit is contained in:
parent
1e7ea96b63
commit
d8a8e7fd8e
6 changed files with 65 additions and 8 deletions
|
@ -22,6 +22,7 @@ RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-r
|
||||||
libpq-dev \
|
libpq-dev \
|
||||||
curl \
|
curl \
|
||||||
git \
|
git \
|
||||||
|
nginx \
|
||||||
# wand dependencies
|
# wand dependencies
|
||||||
libmagickwand-6.q16-6 libmagickwand-6.q16hdri-6 \
|
libmagickwand-6.q16-6 libmagickwand-6.q16hdri-6 \
|
||||||
&& apt-get autoremove && rm -rf /var/lib/apt/lists/*
|
&& apt-get autoremove && rm -rf /var/lib/apt/lists/*
|
||||||
|
@ -33,6 +34,8 @@ ENV PATH=$VIRTUAL_ENV/bin:$PATH \
|
||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
|
RUN ln -fs /app/etc/nginx.conf /etc/nginx/sites-available/default
|
||||||
|
|
||||||
USER website
|
USER website
|
||||||
|
|
||||||
RUN python -m venv $VIRTUAL_ENV
|
RUN python -m venv $VIRTUAL_ENV
|
||||||
|
|
2
Procfile
2
Procfile
|
@ -1,4 +1,4 @@
|
||||||
web: ./manage.py runserver 0.0.0.0:8000
|
web: ./manage.py runserver 0.0.0.0:8080
|
||||||
watch-js: npm run build:js -- --watch
|
watch-js: npm run build:js -- --watch
|
||||||
watch-css: npm run build:css -- --watch
|
watch-css: npm run build:css -- --watch
|
||||||
watch-contrib: ./scripts/copy-npm-contrib.sh; while inotifywait -e modify ./scripts/copy-npm-contrib.sh; do ./scripts/copy-npm-contrib.sh; done
|
watch-contrib: ./scripts/copy-npm-contrib.sh; while inotifywait -e modify ./scripts/copy-npm-contrib.sh; do ./scripts/copy-npm-contrib.sh; done
|
||||||
|
|
|
@ -17,6 +17,7 @@ services:
|
||||||
- db
|
- db
|
||||||
ports:
|
ports:
|
||||||
- 127.0.0.1:8000:8000
|
- 127.0.0.1:8000:8000
|
||||||
|
- 127.0.0.1:8080:8080
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:6-alpine
|
image: redis:6-alpine
|
||||||
|
|
|
@ -4,7 +4,7 @@ wsgi_app = "website.wsgi:application"
|
||||||
accesslog = "-"
|
accesslog = "-"
|
||||||
disable_redirect_access_to_syslog = True
|
disable_redirect_access_to_syslog = True
|
||||||
preload_app = True
|
preload_app = True
|
||||||
bind = "0.0.0.0"
|
bind = "0.0.0.0:8080"
|
||||||
max_requests = 1200
|
max_requests = 1200
|
||||||
max_requests_jitter = 100
|
max_requests_jitter = 100
|
||||||
forwarded_allow_ips = "*"
|
forwarded_allow_ips = "*"
|
||||||
|
|
50
etc/nginx.conf
Normal file
50
etc/nginx.conf
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
|
||||||
|
access_log /dev/stdout;
|
||||||
|
|
||||||
|
gzip_static on;
|
||||||
|
|
||||||
|
server_tokens off;
|
||||||
|
|
||||||
|
set_real_ip_from 0.0.0.0/0;
|
||||||
|
real_ip_header X-Forwarded-For;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_buffers 32 4k;
|
||||||
|
proxy_connect_timeout 240;
|
||||||
|
proxy_headers_hash_bucket_size 128;
|
||||||
|
proxy_headers_hash_max_size 1024;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_read_timeout 240;
|
||||||
|
proxy_redirect http:// $scheme://;
|
||||||
|
proxy_send_timeout 240;
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Host $host;
|
||||||
|
proxy_set_header X-Forwarded-Method $request_method;
|
||||||
|
proxy_set_header X-Forwarded-Port $server_port;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Server $host;
|
||||||
|
proxy_set_header X-Forwarded-Ssl on;
|
||||||
|
proxy_set_header X-Forwarded-Uri $request_uri;
|
||||||
|
proxy_set_header X-Original-Method $request_method;
|
||||||
|
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
|
||||||
|
proxy_pass http://localhost:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /static {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
alias /app/collected-static;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /media {
|
||||||
|
expires 1h;
|
||||||
|
alias /app/media;
|
||||||
|
}
|
||||||
|
}
|
|
@ -45,12 +45,6 @@ urlpatterns = [
|
||||||
path("", include("website.legacy.urls")),
|
path("", include("website.legacy.urls")),
|
||||||
path("api/", include("website.api.urls", namespace="api")),
|
path("api/", include("website.api.urls", namespace="api")),
|
||||||
path("", include(favicon_urls)),
|
path("", include(favicon_urls)),
|
||||||
# Some say it's a bad idea to serve media with Django - I don't care
|
|
||||||
re_path(
|
|
||||||
r"^%s(?P<path>.*)$" % re.escape(settings.MEDIA_URL.lstrip("/")),
|
|
||||||
cache_control(max_age=60 * 60)(serve),
|
|
||||||
{"document_root": settings.MEDIA_ROOT},
|
|
||||||
),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,6 +59,15 @@ if settings.DEBUG:
|
||||||
# Add django-debug-toolbar
|
# Add django-debug-toolbar
|
||||||
urlpatterns.append(path("__debug__/", include("debug_toolbar.urls")))
|
urlpatterns.append(path("__debug__/", include("debug_toolbar.urls")))
|
||||||
|
|
||||||
|
urlpatterns.append(
|
||||||
|
# Media is served by nginx in production
|
||||||
|
re_path(
|
||||||
|
r"^%s(?P<path>.*)$" % re.escape(settings.MEDIA_URL.lstrip("/")),
|
||||||
|
cache_control(max_age=60 * 60)(serve),
|
||||||
|
{"document_root": settings.MEDIA_ROOT},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if settings.DEBUG or settings.TEST:
|
if settings.DEBUG or settings.TEST:
|
||||||
urlpatterns.extend(
|
urlpatterns.extend(
|
||||||
|
|
Loading…
Reference in a new issue