Last active
January 10, 2023 13:44
-
-
Save lukecav/ef73895614d69d9bb243c7969835ff59 to your computer and use it in GitHub Desktop.
Docker image with Nginx front-end for WordPress PHP-FPM image - Updated NGNIX config - includes updated expires headers, browser caching and Gzip enabled.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# WordPress single site rules. | |
# Designed to be included in any server {} block. | |
# This order might seem weird - this is attempted to match last if rules below fail. | |
# http://wiki.nginx.org/HttpCoreModule | |
location / { | |
try_files $uri $uri/ /index.php?$args; | |
} | |
# Add trailing slash to */wp-admin requests. | |
rewrite /wp-admin$ $scheme://$host$uri/ permanent; | |
# Directives to send expires headers and turn off 404 error logging. | |
location ~* ^.+\.(eot|otf|woff|woff2|ttf|rss|atom|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { | |
access_log off; log_not_found off; expires max; | |
} | |
# Media: images, icons, video, audio send expires headers. | |
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$ { | |
expires 1M; | |
access_log off; | |
add_header Cache-Control "public"; | |
} | |
# CSS and Javascript send expires headers. | |
location ~* \.(?:css|js)$ { | |
expires 1y; | |
access_log off; | |
add_header Cache-Control "public"; | |
} | |
# HTML send expires headers. | |
location ~* \.(html)$ { | |
expires 7d; | |
access_log off; | |
add_header Cache-Control "public"; | |
} | |
# Browser caching of static assets. | |
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ { | |
expires 7d; | |
add_header Cache-Control "public, no-transform"; | |
} | |
# Enable Gzip compression in NGNIX. | |
gzip on; | |
gzip_disable "msie6"; | |
gzip_static on; | |
gzip_vary on; | |
gzip_proxied any; | |
gzip_comp_level 6; | |
gzip_min_length 512; | |
gzip_buffers 16 8k; | |
gzip_http_version 1.1; | |
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/rss+xml text/javascript image/svg+xml font/truetype application/x-font-ttf text/x-component font/opentype application/vnd.ms-fontobject; | |
# Pass all .php files onto a php-fpm/php-fcgi server. | |
location ~ [^/]\.php(/|$) { | |
# Setup var defaults | |
set $no_cache ""; | |
# If non GET/HEAD, don't cache & mark user as uncacheable for 1 second via cookie | |
if ($request_method !~ ^(GET|HEAD)$) { | |
set $no_cache "1"; | |
} | |
# Don't cache logged in users or commenters | |
if ( $http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_|wp-settings-|wp-resetpass-|woocommerce_" ) { | |
set $no_cache "1"; | |
} | |
# Don't cache admin URLs | |
if ($request_uri ~* "/(wp-admin/|wp-login.php)") { | |
set $no_cache "1"; | |
} | |
# Don't cache WooCommerce dynamic content | |
if ($request_uri ~* "/store.*|/cart.*|/my-account.*|/checkout.*|/addons.*|/administrator.*|/resetpass.*|\?(add-to-cart|wc-api|wc-ajax=get_refreshed_fragments)=") { | |
set $no_cache "1"; | |
} | |
# Drop no cache cookie if need be | |
# (for some reason, add_header fails if included in prior if-block) | |
if ($no_cache = "1") { | |
add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/"; | |
add_header X-Microcachable "0"; | |
} | |
# Bypass cache if no-cache cookie is set | |
if ($http_cookie ~* "_mcnc") { | |
set $no_cache "1"; | |
} | |
# Bypass cache if flag is set | |
fastcgi_no_cache $no_cache; | |
fastcgi_cache_bypass $no_cache; | |
fastcgi_cache microcache; | |
fastcgi_cache_valid 404 30s; | |
fastcgi_cache_valid 200 10s; | |
fastcgi_max_temp_file_size 1M; | |
#Use stale cache items while updating in the background | |
fastcgi_cache_use_stale updating error timeout invalid_header http_500; | |
fastcgi_cache_lock on; | |
fastcgi_cache_lock_timeout 10s; | |
fastcgi_read_timeout 300; | |
fastcgi_buffers 8 256k; | |
fastcgi_buffer_size 128k; | |
fastcgi_intercept_errors on; | |
fastcgi_split_path_info ^(.+?\.php)(/.*)$; | |
if (!-f $document_root$fastcgi_script_name) { | |
return 404; | |
} | |
# This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default) | |
if ($no_cache == "") { | |
add_header X-Nginx-Cache $upstream_cache_status; | |
} | |
# Ignore headers set by WordPress | |
fastcgi_ignore_headers Cache-Control Expires; | |
include fastcgi_params; | |
fastcgi_index index.php; | |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
fastcgi_param PHP_VALUE "upload_max_filesize=64m | |
post_max_size=64m"; | |
fastcgi_pass wordpress:9000; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment