# Rate limiting zones limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # FastCGI cache zone fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=laravel:100m max_size=1g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name amazingarchitecture.com www.amazingarchitecture.com; return 301 https://amazingarchitecture.com$request_uri; } # WWW to non-WWW redirect server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.amazingarchitecture.com; ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://amazingarchitecture.com$request_uri; } # Main server block server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name amazingarchitecture.com; root /var/www/html/amazing/public; index index.php index.html; charset utf-8; # SSL Configuration ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # Logging access_log /var/log/nginx/amazingarchitecture-access.log; error_log /var/log/nginx/amazingarchitecture-error.log error; # Static assets with long-term caching location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } location ~* \.(css|js|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Laravel storage files with moderate caching location ^~ /storage/ { expires 30d; add_header Cache-Control "public"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Favicon and robots.txt location = /favicon.ico { expires 1y; add_header Cache-Control "public, immutable"; access_log off; log_not_found off; } location = /robots.txt { expires 1d; add_header Cache-Control "public"; access_log off; log_not_found off; } # Rate limiting for login routes location ~ ^/(login|register|password|revabar|user) { limit_req zone=login burst=3 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Rate limiting for API routes location ^~ /api/ { limit_req zone=api burst=20 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Main location block with caching location / { try_files $uri $uri/ @laravel; } location @laravel { # Skip cache for certain conditions set $skip_cache 0; # Skip cache for POST requests if ($request_method = POST) { set $skip_cache 1; } # Skip cache for URLs with query parameters (except utm_ parameters) if ($args ~ "^(?!utm_).*") { set $skip_cache 1; } # Skip cache for admin/dashboard URLs if ($uri ~ "^/(admin|dashboard|login|register)") { set $skip_cache 1; } # Skip cache for logged-in users (check for Laravel session cookie) if ($http_cookie ~* "laravel_session") { set $skip_cache 1; } fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache laravel; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_cache_lock on; add_header X-Cache-Status $upstream_cache_status; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param REQUEST_URI $request_uri; fastcgi_param QUERY_STRING $args; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_intercept_errors off; # Optimized FastCGI buffers fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; # Timeouts fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # PHP files (fallback for direct PHP access) location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; # Same buffer settings as above fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # Security: deny access to sensitive files location ~ /\.(?!well-known).* { deny all; } location ~ ^/(\.env|\.git|composer\.(json|lock)|package\.json|gulpfile\.js|webpack\.mix\.js) { deny all; } # Compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml; # Brotli compression (if available) # brotli on; # brotli_comp_level 6; # brotli_min_length 1024; # brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; }# Rate limiting zones limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # FastCGI cache zone fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=laravel:100m max_size=1g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name amazingarchitecture.com www.amazingarchitecture.com; return 301 https://amazingarchitecture.com$request_uri; } # WWW to non-WWW redirect server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.amazingarchitecture.com; ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://amazingarchitecture.com$request_uri; } # Main server block server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name amazingarchitecture.com; root /var/www/html/amazing/public; index index.php index.html; charset utf-8; # SSL Configuration ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # Logging access_log /var/log/nginx/amazingarchitecture-access.log; error_log /var/log/nginx/amazingarchitecture-error.log error; # Static assets with long-term caching location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } location ~* \.(css|js|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Laravel storage files with moderate caching location ^~ /storage/ { expires 30d; add_header Cache-Control "public"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Favicon and robots.txt location = /favicon.ico { expires 1y; add_header Cache-Control "public, immutable"; access_log off; log_not_found off; } location = /robots.txt { expires 1d; add_header Cache-Control "public"; access_log off; log_not_found off; } # Rate limiting for login routes location ~ ^/(login|register|password|revabar|user) { limit_req zone=login burst=3 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Rate limiting for API routes location ^~ /api/ { limit_req zone=api burst=20 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Main location block with caching location / { try_files $uri $uri/ @laravel; } location @laravel { # Skip cache for certain conditions set $skip_cache 0; # Skip cache for POST requests if ($request_method = POST) { set $skip_cache 1; } # Skip cache for URLs with query parameters (except utm_ parameters) if ($args ~ "^(?!utm_).*") { set $skip_cache 1; } # Skip cache for admin/dashboard URLs if ($uri ~ "^/(admin|dashboard|login|register)") { set $skip_cache 1; } # Skip cache for logged-in users (check for Laravel session cookie) if ($http_cookie ~* "laravel_session") { set $skip_cache 1; } fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache laravel; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_cache_lock on; add_header X-Cache-Status $upstream_cache_status; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param REQUEST_URI $request_uri; fastcgi_param QUERY_STRING $args; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_intercept_errors off; # Optimized FastCGI buffers fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; # Timeouts fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # PHP files (fallback for direct PHP access) location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; # Same buffer settings as above fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # Security: deny access to sensitive files location ~ /\.(?!well-known).* { deny all; } location ~ ^/(\.env|\.git|composer\.(json|lock)|package\.json|gulpfile\.js|webpack\.mix\.js) { deny all; } # Compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml; # Brotli compression (if available) # brotli on; # brotli_comp_level 6; # brotli_min_length 1024; # brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; }# Rate limiting zones limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # FastCGI cache zone fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=laravel:100m max_size=1g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name amazingarchitecture.com www.amazingarchitecture.com; return 301 https://amazingarchitecture.com$request_uri; } # WWW to non-WWW redirect server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.amazingarchitecture.com; ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://amazingarchitecture.com$request_uri; } # Main server block server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name amazingarchitecture.com; root /var/www/html/amazing/public; index index.php index.html; charset utf-8; # SSL Configuration ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # Logging access_log /var/log/nginx/amazingarchitecture-access.log; error_log /var/log/nginx/amazingarchitecture-error.log error; # Static assets with long-term caching location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } location ~* \.(css|js|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Laravel storage files with moderate caching location ^~ /storage/ { expires 30d; add_header Cache-Control "public"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Favicon and robots.txt location = /favicon.ico { expires 1y; add_header Cache-Control "public, immutable"; access_log off; log_not_found off; } location = /robots.txt { expires 1d; add_header Cache-Control "public"; access_log off; log_not_found off; } # Rate limiting for login routes location ~ ^/(login|register|password|revabar|user) { limit_req zone=login burst=3 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Rate limiting for API routes location ^~ /api/ { limit_req zone=api burst=20 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Main location block with caching location / { try_files $uri $uri/ @laravel; } location @laravel { # Skip cache for certain conditions set $skip_cache 0; # Skip cache for POST requests if ($request_method = POST) { set $skip_cache 1; } # Skip cache for URLs with query parameters (except utm_ parameters) if ($args ~ "^(?!utm_).*") { set $skip_cache 1; } # Skip cache for admin/dashboard URLs if ($uri ~ "^/(admin|dashboard|login|register)") { set $skip_cache 1; } # Skip cache for logged-in users (check for Laravel session cookie) if ($http_cookie ~* "laravel_session") { set $skip_cache 1; } fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache laravel; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_cache_lock on; add_header X-Cache-Status $upstream_cache_status; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param REQUEST_URI $request_uri; fastcgi_param QUERY_STRING $args; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_intercept_errors off; # Optimized FastCGI buffers fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; # Timeouts fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # PHP files (fallback for direct PHP access) location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; # Same buffer settings as above fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # Security: deny access to sensitive files location ~ /\.(?!well-known).* { deny all; } location ~ ^/(\.env|\.git|composer\.(json|lock)|package\.json|gulpfile\.js|webpack\.mix\.js) { deny all; } # Compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml; # Brotli compression (if available) # brotli on; # brotli_comp_level 6; # brotli_min_length 1024; # brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; }# Rate limiting zones limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # FastCGI cache zone fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=laravel:100m max_size=1g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name amazingarchitecture.com www.amazingarchitecture.com; return 301 https://amazingarchitecture.com$request_uri; } # WWW to non-WWW redirect server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.amazingarchitecture.com; ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://amazingarchitecture.com$request_uri; } # Main server block server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name amazingarchitecture.com; root /var/www/html/amazing/public; index index.php index.html; charset utf-8; # SSL Configuration ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # Logging access_log /var/log/nginx/amazingarchitecture-access.log; error_log /var/log/nginx/amazingarchitecture-error.log error; # Static assets with long-term caching location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } location ~* \.(css|js|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Laravel storage files with moderate caching location ^~ /storage/ { expires 30d; add_header Cache-Control "public"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Favicon and robots.txt location = /favicon.ico { expires 1y; add_header Cache-Control "public, immutable"; access_log off; log_not_found off; } location = /robots.txt { expires 1d; add_header Cache-Control "public"; access_log off; log_not_found off; } # Rate limiting for login routes location ~ ^/(login|register|password|revabar|user) { limit_req zone=login burst=3 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Rate limiting for API routes location ^~ /api/ { limit_req zone=api burst=20 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Main location block with caching location / { try_files $uri $uri/ @laravel; } location @laravel { # Skip cache for certain conditions set $skip_cache 0; # Skip cache for POST requests if ($request_method = POST) { set $skip_cache 1; } # Skip cache for URLs with query parameters (except utm_ parameters) if ($args ~ "^(?!utm_).*") { set $skip_cache 1; } # Skip cache for admin/dashboard URLs if ($uri ~ "^/(admin|dashboard|login|register)") { set $skip_cache 1; } # Skip cache for logged-in users (check for Laravel session cookie) if ($http_cookie ~* "laravel_session") { set $skip_cache 1; } fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache laravel; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_cache_lock on; add_header X-Cache-Status $upstream_cache_status; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param REQUEST_URI $request_uri; fastcgi_param QUERY_STRING $args; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_intercept_errors off; # Optimized FastCGI buffers fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; # Timeouts fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # PHP files (fallback for direct PHP access) location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; # Same buffer settings as above fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # Security: deny access to sensitive files location ~ /\.(?!well-known).* { deny all; } location ~ ^/(\.env|\.git|composer\.(json|lock)|package\.json|gulpfile\.js|webpack\.mix\.js) { deny all; } # Compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml; # Brotli compression (if available) # brotli on; # brotli_comp_level 6; # brotli_min_length 1024; # brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; }# Rate limiting zones limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # FastCGI cache zone fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=laravel:100m max_size=1g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # HTTP to HTTPS redirect server { listen 80; listen [::]:80; server_name amazingarchitecture.com www.amazingarchitecture.com; return 301 https://amazingarchitecture.com$request_uri; } # WWW to non-WWW redirect server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.amazingarchitecture.com; ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://amazingarchitecture.com$request_uri; } # Main server block server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name amazingarchitecture.com; root /var/www/html/amazing/public; index index.php index.html; charset utf-8; # SSL Configuration ssl_certificate /etc/letsencrypt/live/amazingarchitecture.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/amazingarchitecture.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # Logging access_log /var/log/nginx/amazingarchitecture-access.log; error_log /var/log/nginx/amazingarchitecture-error.log error; # Static assets with long-term caching location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } location ~* \.(css|js|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Laravel storage files with moderate caching location ^~ /storage/ { expires 30d; add_header Cache-Control "public"; add_header Vary "Accept-Encoding"; try_files $uri =404; access_log off; } # Favicon and robots.txt location = /favicon.ico { expires 1y; add_header Cache-Control "public, immutable"; access_log off; log_not_found off; } location = /robots.txt { expires 1d; add_header Cache-Control "public"; access_log off; log_not_found off; } # Rate limiting for login routes location ~ ^/(login|register|password|revabar|user) { limit_req zone=login burst=3 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Rate limiting for API routes location ^~ /api/ { limit_req zone=api burst=20 nodelay; try_files $uri $uri/ /index.php?$query_string; } # Main location block with caching location / { try_files $uri $uri/ @laravel; } location @laravel { # Skip cache for certain conditions set $skip_cache 0; # Skip cache for POST requests if ($request_method = POST) { set $skip_cache 1; } # Skip cache for URLs with query parameters (except utm_ parameters) if ($args ~ "^(?!utm_).*") { set $skip_cache 1; } # Skip cache for admin/dashboard URLs if ($uri ~ "^/(admin|dashboard|login|register)") { set $skip_cache 1; } # Skip cache for logged-in users (check for Laravel session cookie) if ($http_cookie ~* "laravel_session") { set $skip_cache 1; } fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache laravel; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_cache_lock on; add_header X-Cache-Status $upstream_cache_status; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param REQUEST_URI $request_uri; fastcgi_param QUERY_STRING $args; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_intercept_errors off; # Optimized FastCGI buffers fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; # Timeouts fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # PHP files (fallback for direct PHP access) location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; # Same buffer settings as above fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; fastcgi_busy_buffers_size 64k; fastcgi_temp_file_write_size 64k; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; fastcgi_read_timeout 60s; } # Security: deny access to sensitive files location ~ /\.(?!well-known).* { deny all; } location ~ ^/(\.env|\.git|composer\.(json|lock)|package\.json|gulpfile\.js|webpack\.mix\.js) { deny all; } # Compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml; # Brotli compression (if available) # brotli on; # brotli_comp_level 6; # brotli_min_length 1024; # brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; } Server Error
500
Server Error