You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							76 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							76 lines
						
					
					
						
							2.4 KiB
						
					
					
				| # TimeSafari Nginx Configuration | |
| # Author: Matthew Raymer | |
| # Description: Main nginx configuration for TimeSafari web application | |
| # | |
| # Features: | |
| # - Security headers for web application | |
| # - Gzip compression for better performance | |
| # - Proper handling of Vue.js SPA routing | |
| # - Static file caching optimization | |
| # - Security hardening | |
|  | |
| # user nginx;  # Commented out - nginx runs as non-root user in container | |
| worker_processes auto; | |
| error_log /var/log/nginx/error.log warn; | |
| pid /tmp/nginx.pid;  # Use /tmp for PID file to avoid permission issues | |
|  | |
| events { | |
|     worker_connections 1024; | |
|     use epoll; | |
|     multi_accept on; | |
| } | |
| 
 | |
| http { | |
|     include /etc/nginx/mime.types; | |
|     default_type application/octet-stream; | |
| 
 | |
|     # Logging format | |
|     log_format main '$remote_addr - $remote_user [$time_local] "$request" ' | |
|                     '$status $body_bytes_sent "$http_referer" ' | |
|                     '"$http_user_agent" "$http_x_forwarded_for"'; | |
| 
 | |
|     access_log /var/log/nginx/access.log main; | |
| 
 | |
|     # Performance optimizations | |
|     sendfile on; | |
|     tcp_nopush on; | |
|     tcp_nodelay on; | |
|     keepalive_timeout 65; | |
|     types_hash_max_size 2048; | |
|     client_max_body_size 16M; | |
| 
 | |
|     # Gzip compression | |
|     gzip on; | |
|     gzip_vary on; | |
|     gzip_min_length 1024; | |
|     gzip_proxied any; | |
|     gzip_comp_level 6; | |
|     gzip_types | |
|         text/plain | |
|         text/css | |
|         text/xml | |
|         text/javascript | |
|         application/json | |
|         application/javascript | |
|         application/xml+rss | |
|         application/atom+xml | |
|         image/svg+xml; | |
| 
 | |
|     # 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 Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https:; frame-ancestors 'self';" always; | |
| 
 | |
|     # SharedArrayBuffer support headers for absurd-sql | |
|     add_header Cross-Origin-Opener-Policy "same-origin" always; | |
|     add_header Cross-Origin-Embedder-Policy "require-corp" always; | |
| 
 | |
|     # Rate limiting | |
|     limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; | |
|     limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; | |
| 
 | |
|     # Include server configurations | |
|     include /etc/nginx/conf.d/*.conf; | |
| }  |