server {
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}80;
listen [{{ data.sites[_site].ipv6 }}]:80;
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}443 ssl{{ isHTTP2() ? ' http2' : '' }};
listen [{{ data.sites[_site].ipv6 }}]:443 ssl{{ isHTTP2() ? ' http2' : '' }};
server_name {{ isWWW() ? 'www.' : '' }}{{ _domain }};
set $base {{ getPath(_site) }};
root $base{{ data.sites[_site].document_root }};
root {{ getPath(_site) }}{{ data.sites[_site].document_root }};
# SSL
ssl_certificate {{ getSslCertificate(_site) }};
ssl_certificate_key {{ getSslCertificateKey(_site) }};
ssl_trusted_certificate /etc/letsencrypt/live/{{ _domain }}/chain.pem;
# HSTS
add_header Strict-Transport-Security "max-age=31536000{{ isHSTSSubdomains(_site) ? '; includeSubDomains' : '' }}{{ isHSTSPreload(_site) ? '; preload' : '' }}" always;
# logging
access_log {{ getAccessLogDomainPath(_site) }};
error_log {{ getErrorLogDomainPath(_site) }};
# index.php
index index.php;
# {{ isFallbackHTML(_site) ? 'index.html' : ( isFallbackPHP(_site) ? 'index.php' : '' ) }} fallback
location / {
try_files $uri $uri/ {{ isFallbackHTML(_site) ? '/index.html' : ( isFallbackPHP(_site) ? '/index.php?$query_string' : '' ) }};
}
# index.php fallback
location ~ ^{{ data.sites[_site].fallback_php_path }} {
try_files $uri $uri/ /index.php?$query_string;
}
# Python
location / {
include nginxconfig.io/python_uwsgi.conf;
}
# Django media
location /media/ {
alias $base/media/;
}
# Django static
location /static/ {
alias $base/static/;
}
# reverse proxy
location {{ data.sites[_site].proxy_path }} {
proxy_pass {{ data.sites[_site].proxy_pass }};
include nginxconfig.io/proxy.conf;
}
# handle .php
location ~ {{ isLegacyPHPRouting(_site) ? '[^/]\\.php(/|$)' : '\\.php$' }} {
include nginxconfig.io/php_fastcgi.conf;
}
include nginxconfig.io/general.conf;
include nginxconfig.io/wordpress.conf;
include nginxconfig.io/drupal.conf;
include nginxconfig.io/magento.conf;
}
# CDN
server {
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}{{ isHTTPS(_site) ? '443 ssl' : '80' }}{{ isHTTP2(_site) ? ' http2' : '' }};
listen [{{ data.sites[_site].ipv6 }}]:{{ isHTTPS(_site) ? '443 ssl' : '80' }}{{ isHTTP2(_site) ? ' http2' : '' }};
server_name cdn.{{ _domain }};
root /var/www/{{ _domain }}{{ data.sites[_site].document_root }};
access_log off;
# SSL
ssl_certificate {{ getSslCertificate(_site) }};
ssl_certificate_key {{ getSslCertificateKey(_site) }};
ssl_trusted_certificate /etc/letsencrypt/live/{{ _domain }}/chain.pem;
# disable access_log
access_log off;
# gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types {{ gzipTypes }};
# allow safe files
location ~* \.(?:{{ extensions.assets }}|{{ extensions.fonts }}|{{ extensions.svg }}|{{ extensions.images }}|{{ extensions.audio }}|{{ extensions.video }}|{{ extensions.docs }})$ {
add_header Access-Control-Allow-Origin "*";
add_header Cache-Control "public";
expires 30d;
}
# deny everything else
location / {
deny all;
}
}
# {{ isWWW() ? 'non-www, ' : '' }}subdomains redirect
server {
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};
listen [{{ data.sites[_site].ipv6 }}]:{{ isHTTPS() ? '443 ssl' : '80' }}{{ isHTTP2() ? ' http2' : '' }};
server_name {{ isWWW() ? ('.' + _domain) : ('*.' + _domain) }};
# SSL
ssl_certificate {{ getSslCertificate(_site) }};
ssl_certificate_key {{ getSslCertificateKey(_site) }};
ssl_trusted_certificate /etc/letsencrypt/live/{{ _domain }}/chain.pem;
return 301 http{{ isHTTPS() ? 's' : '' }}://{{ isWWW() ? 'www.' : '' }}{{ _domain }}$request_uri;
}
# HTTP redirect
server {
listen {{ data.sites[_site].ipv4 !== '*' ? data.sites[_site].ipv4 + ':' : '' }}80;
listen [{{ data.sites[_site].ipv6 }}]:80;
server_name .{{ _domain }};
include nginxconfig.io/letsencrypt.conf;
location / {
return 301 https://{{ isWWW(_site) ? 'www.' : '' }}{{ _domain }}$request_uri;
}
return 301 https://{{ isWWW(_site) ? 'www.' : '' }}{{ _domain }}$request_uri;
}