
Without gzip explicitly enabled, load times suffer from transferring over a megabyte of plaintext javascript. With gzip enabled, the bundle is down to about 300K, and loads much faster. This change does not enable gzip on files that are already compressed, so images, fonts, and videos will be sent without the CPU overhead.
139 lines
5.2 KiB
Plaintext
139 lines
5.2 KiB
Plaintext
server {
|
|
listen 80;
|
|
listen [::]:80;
|
|
server_name peertube.example.com;
|
|
|
|
access_log /var/log/nginx/peertube.example.com.access.log;
|
|
error_log /var/log/nginx/peertube.example.com.error.log;
|
|
|
|
location /.well-known/acme-challenge/ {
|
|
default_type "text/plain";
|
|
root /var/www/certbot;
|
|
}
|
|
location / { return 301 https://$host$request_uri; }
|
|
}
|
|
|
|
server {
|
|
listen 443 ssl http2;
|
|
listen [::]:443 ssl http2;
|
|
server_name peertube.example.com;
|
|
|
|
# For example with certbot (you need a certificate to run https)
|
|
ssl_certificate /etc/letsencrypt/live/peertube.example.com/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/peertube.example.com/privkey.pem;
|
|
|
|
# Security hardening (as of 11/02/2018)
|
|
ssl_protocols TLSv1.2; # TLSv1.3, TLSv1.2 if nginx >= 1.13.0
|
|
ssl_prefer_server_ciphers on;
|
|
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
|
|
# ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0, not compatible with import-videos script
|
|
ssl_session_timeout 10m;
|
|
ssl_session_cache shared:SSL:10m;
|
|
ssl_session_tickets off; # Requires nginx >= 1.5.9
|
|
ssl_stapling on; # Requires nginx >= 1.3.7
|
|
ssl_stapling_verify on; # Requires nginx => 1.3.7
|
|
|
|
# Configure with your resolvers
|
|
# resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
|
|
# resolver_timeout 5s;
|
|
|
|
# Enable compression for JS/CSS/HTML and JSON, for improved client load times
|
|
gzip on;
|
|
gzip_types text/plain text/css text/html application/javascript application/json;
|
|
gzip_vary on;
|
|
|
|
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
|
|
|
|
access_log /var/log/nginx/peertube.example.com.access.log;
|
|
error_log /var/log/nginx/peertube.example.com.error.log;
|
|
|
|
location ^~ '/.well-known/acme-challenge' {
|
|
default_type "text/plain";
|
|
root /var/www/certbot;
|
|
}
|
|
|
|
location ~ ^/client/(.*\.(js|css|woff2|otf|ttf|woff|eot))$ {
|
|
add_header Cache-Control "public, max-age=31536000, immutable";
|
|
|
|
alias /var/www/peertube/peertube-latest/client/dist/$1;
|
|
}
|
|
|
|
location ~ ^/static/(thumbnails|avatars)/ {
|
|
if ($request_method = 'OPTIONS') {
|
|
add_header 'Access-Control-Allow-Origin' '*';
|
|
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
|
|
add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
|
add_header 'Access-Control-Max-Age' 1728000;
|
|
add_header 'Content-Type' 'text/plain charset=UTF-8';
|
|
add_header 'Content-Length' 0;
|
|
return 204;
|
|
}
|
|
|
|
add_header 'Access-Control-Allow-Origin' '*';
|
|
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
|
|
add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
|
|
|
# Cache 2 hours
|
|
add_header Cache-Control "public, max-age=7200";
|
|
|
|
root /var/www/peertube/storage;
|
|
|
|
rewrite ^/static/(thumbnails|avatars)/(.*)$ /$1/$2 break;
|
|
try_files $uri /;
|
|
}
|
|
|
|
location / {
|
|
proxy_pass http://localhost:9000;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
# Hard limit, PeerTube does not support videos > 8GB
|
|
client_max_body_size 8G;
|
|
proxy_connect_timeout 600;
|
|
proxy_send_timeout 600;
|
|
proxy_read_timeout 600;
|
|
send_timeout 600;
|
|
}
|
|
|
|
# Bypass PeerTube webseed route for better performances
|
|
location /static/webseed {
|
|
# Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client
|
|
limit_rate 800k;
|
|
|
|
if ($request_method = 'OPTIONS') {
|
|
add_header 'Access-Control-Allow-Origin' '*';
|
|
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
|
|
add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
|
add_header 'Access-Control-Max-Age' 1728000;
|
|
add_header 'Content-Type' 'text/plain charset=UTF-8';
|
|
add_header 'Content-Length' 0;
|
|
return 204;
|
|
}
|
|
|
|
if ($request_method = 'GET') {
|
|
add_header 'Access-Control-Allow-Origin' '*';
|
|
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
|
|
add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
|
|
|
# Don't spam access log file with byte range requests
|
|
access_log off;
|
|
}
|
|
|
|
alias /var/www/peertube/storage/videos;
|
|
}
|
|
|
|
# Websocket tracker
|
|
location /tracker/socket {
|
|
# Peers send a message to the tracker every 15 minutes
|
|
# Don't close the websocket before this time
|
|
proxy_read_timeout 1200s;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
proxy_http_version 1.1;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header Host $host;
|
|
proxy_pass http://localhost:9000;
|
|
}
|
|
}
|