Q. How to configure and host static website on Nginx web server?
A. Nginx is a lightweight web server and an alternative to Apache. In order to run a static website on Nginx web server, you must configure your server to at least the following basic configuration. Failure to do this will stop some basic functions such as access to sitemap.xml which is required when submit a page to google and bing in webmaster tool.
Note : The following steps has been tested using root access on Nginx web server :
Static Website Configuration for Nginx Web Server
1. This is main Nginx configuration file. Make sure that sites-available folder was included at the bottom of the configuration as below :
# sudo vim /etc/nginx/nginx.conf
user nginx; worker_processes 2; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; 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; include /etc/nginx/sites-available/*.conf; }
2. Create static.conf file which contains the configuration specific for static website that running on Nginx web server :
# sudo vim /etc/nginx/conf.d/static.conf
# WORDPRESS : Rewrite rules, sends everything through index.php and keeps the appended query string intact location / { try_files $uri $uri/ /index.php?q=$uri&$args; } # SECURITY : Deny all attempts to access PHP Files in the uploads directory location ~* /(?:uploads|files)/.*.php$ { deny all; } # REQUIREMENTS : Enable PHP Support location ~ .php$ { # SECURITY : Zero day Exploit Protection try_files $uri =404; # ENABLE : Enable PHP, listen fpm sock fastcgi_split_path_info ^(.+.php)(/.+)$; #fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffer_size 128k; fastcgi_buffers 256 4k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; } location /sitemap.xml.gz { add_header Cache-Control "public, must-revalidate"; }
3. Create common.conf file for common option in Nginx web server :
# sudo vim /etc/nginx/conf.d/common.conf
Add below :
# Global configuration file. # ESSENTIAL : Configure Nginx Listening Port listen 80; # ESSENTIAL : Default file to serve. If the first file isn't found, index index.php index.html index.htm; # ESSENTIAL : no favicon logs location = /favicon.ico { log_not_found off; access_log off; } # ESSENTIAL : robots.txt location = /robots.txt { allow all; log_not_found off; access_log off; } # ESSENTIAL : Configure 404 Pages error_page 404 /404.html; # ESSENTIAL : Configure 50x Pages error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # SECURITY : Deny all attempts to access hidden files .abcde location ~ /. { deny all; } # PERFORMANCE : Set expires headers for static files and turn off logging. location ~* ^.+.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires 30d; add_header Pragma no-cache; add_header Cache-Control "public"; }
4. Configure website1 configuration :
# sudo vim /etc/nginx/sites-available/website1.com.conf
server { listen 80; server_name website1.com; rewrite ^/(.*)$ http://www.website1.com/$1 permanent; } server { server_name www.website1.com; root /var/www/html/website1.com; access_log /var/log/nginx/website1.com.access.log; error_log /var/log/nginx/website1.com.error.log; include conf.d/common.conf; include conf.d/static.conf; }
5. Verify Nginx configuration syntax :
# sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
6. Restart Nginx web server :
For CentOS 7 :
# sudo systemctl restart nginx
For CentOS 5/ CentOS 6
# sudo service nginx restart
Static website are the cheapest was to start a website and does not require a lot of server resources to run it. Basic shared hosting plan is sufficient to use and nowaday static website is widely used by companies that are smaller.