Хабр Курсы для всех
РЕКЛАМА
 Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать! 
gzip_comp_level 6;
Открыть только локальный доступ
add_header Strict-Transport-Security max-age=2592000;
includeSubDomainsadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains";Для начала вам потребуется создать пароль и сохранить его в обычной текстовом файле:
имя: пароль
Надо обязательно добавить инфу о том, что если у нас есть поддомены (cdn, api, etc) которые работают в режиме https, то надо указать includeSubDomainsТут двояко. Указывать
add_header Strict-Transport-Security «max-age=31536000; includeSubDomains»;
includeSubDomains стоит только если вы уверены что ВСЕ ваши поддомены работают по HTTPS.или если есть много времени, то на 4096Не стоит. Использование 4096-битного ключа, замедляет работу сервера, пусть и все же не прям существенно, но неприятно.
ssl_prefer_server_ciphers, т.е. что то вот в таком духе:ssl_session_timeout 1h;
ssl_session_cache shared:SSL:16m;
 
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate "[...].trusted.crt";
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
 
ssl_prefer_server_ciphers on;
Не стоит. Использование 4096-битного ключа, замедляет работу сервера, пусть и все же не прям существенно, но неприятно.И не поддерживается jvm (включая актуальную 8u66). Стоит учитывать, если используются java-клиенты.
# Запрет на открытие в iframe
add_header X-Frame-Options SAMEORIGIN;
# Блокировка путей, начинающийся с точки (например, ".git", ".svn")
location ~ /\. {
      deny all;
}
# Большинство хакерских сканеров
if ( $http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan) ) {
    return 403;
}
# Контексте сервера
access_log  off;
# В контексте статики
location ~* \.(pdf|gif|jpg|css|txt|js|png|ico|svg|ttf|woff|eot|html|htm|json|woff2)$ {
                root   /www/path/static;
                log_not_found off;
        }
for i in `find ./* -type f -name '*.js'`; do echo $i; gzip -c -9 $i > $i.gz; done;
for i in `find ./* -type f -name '*.css'`; do echo $i; gzip -c -9 $i > $i.gz; done;
 location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
        }
        location ^wp-includes/(.*).php {
            deny all;
        }
        location ^/wp-admin/includes(.*)$ {
            deny all;
        }
        location ~ wp-config.php {
            deny all;
        }
location ^/wp-admin/includes(.*)$ { deny all; }
wp-admin поставить auth_basic, тогда можно будет спокойно работать в админке, пройдя две авторизации (nginx и wp).if ($args ~* "(eval|duplicate|base64|substring|preg_replace|create_function)") {
    return 403;
}
auth_basic (когда в конфиге 
location ~ \.php$ {
  fastcgi_split_path_info ^(.+.php)(.*)$;
  ...
}
fastcgi_split_path_info.В конфиге для Symfony для прода или стейджинга (если судить по / через app.php) не должно быть двух локаций для app_dev.php и app\.php.php
        location ^~ /cloud {
                include apps/cloud.conf;
        }
client_max_body_size 5G; # set max upload size
fastcgi_buffers 64 4K;
index index.php;
error_page 403 /cloud/core/templates/403.php;
error_page 404 /cloud/core/templates/404.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
include headers.conf;
location = /cloud/robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}
location ^~ /cloud/data {
        internal;
        alias /var/www/mysite.org/clouddata/data;
}
location ~ ^/cloud/(data|config|\.ht|db_structure\.xml|README|occ) {
        deny all;
}
rewrite ^/cloud/go/(.+) /cloud/public.php?service=shorty_relay&id=$1 last;
rewrite ^/cloud/caldav(.*)$ /cloud/remote.php/caldav$1 redirect;
rewrite ^/cloud/carddav(.*)$ /cloud/remote.php/carddav$1 redirect;
rewrite ^/cloud/webdav(.*)$ /cloud/remote.php/webdav$1 redirect;
# The following 2 rules are only needed with webfinger
rewrite ^/cloud/.well-known/host-meta /cloud/public.php?service=host-meta last;
rewrite ^/cloud/.well-known/host-meta.json /cloud/public.php?service=host-meta-json last;
rewrite ^/cloud/.well-known/carddav /cloud/remote.php/carddav/ redirect;
rewrite ^/cloud/.well-known/caldav /cloud/remote.php/caldav/ redirect;
rewrite ^(/cloud/core/doc/[^\/]+/)$ $1/index.html;
try_files $uri $uri/ =404;
location ~ ^(/cloud/(?:\w+\.php|core/templates/40\d\.php|apps/files_encryption/files/error.php|ocs/v1.php))(/.*)?$ {
        
        try_files $1 =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$1;
        fastcgi_param PATH_INFO $2;
        fastcgi_param HTTPS on;
        fastcgi_param MOD_X_ACCEL_REDIRECT_ENABLED on;
        fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
        fastcgi_read_timeout 130s;
        fastcgi_pass    unix:/run/php-fpm-cloud.socket;
        fastcgi_intercept_errors on;
}
location ~ \.php$ {
        deny all;
	#можно return 404;
}
# Optional: set long EXPIRES header on static assets
location ~* ^.+\.(jpe?g|gif|bmp|ico|png|css|js|swf)$ {
        expires 30d;
        log_not_found off;
}
Пойдёт. Главное, чтобы та сторона nginx приняла а nginx её
Полезные сниппеты для Nginx конфигов