Nginx Basics
Tags: kubernetes, beginners, webdev, devops
Published: 2023-01-14 09:48:37

### what is Nginx?

* primarily one of the fastest web servers but can also be used as a proxy, reverse proxy, API Gateway, content cache and load balancer.
    
* Its usage as a ***reverse proxy*** and ***load balancer*** is what makes it stand out.
    
* NGINX efficiently handles tasks that might slow down your web server, such as negotiating SSL/TLS or compressing and caching content to improve performance.
    

### Elements of Nginx configuration file

* Nginx is very simple to install and once installed you can start by editing the config file which will usually exist in **/etc/nginx** or **/usr/local/etc/nginx**
    
* <mark>nginx.conf</mark> is the text-based configuration file for Nginx.
    
* It contains elements called *<mark>Directives </mark>* and *<mark>Contexts</mark>.* Directives are written like key-value pairs on each line ending with semicolons(;) Context on the other hand are top-level directives that apply to different kinds of incoming traffic.
    
    * [events](https://nginx.org/en/docs/ngx_core_module.html#events) – General connection processing
        
    * [http](https://nginx.org/en/docs/http/ngx_http_core_module.html#http) – HTTP traffic
        
    * [mail](https://nginx.org/en/docs/mail/ngx_mail_core_module.html#mail) – Mail traffic
        
    * [stream](https://nginx.org/en/docs/stream/ngx_stream_core_module.html#stream) – TCP and UDP traffic
        
* Some directives use { } to group directives together these are called *blocks.* One of such important directives is the `Location [modifier] [URI]{ ... }` this directive is used to route the incoming traffic to various file systems.
    
* Examples of a few directives are given below.
    

```nginx
# These are directives key value; like pairs
user             nobody;
error_log        logs/error.log notice;
worker_processes 1;
```

* Every time you make any changes to the nginx.conf , the nginx must be reloaded to take effect. you can use the command **<mark>nginx -s reload</mark>**
    

### Few important directives to discuss

* **include directive**: This directive includes another file inside the config file. include mime.types is one of the popular usages, a web server needs to know what kind of data is incoming, and this data is embedded into the headers of the incoming requests. nginx, suggest using this directive to break down your config files into simpler manageable files.
    
    ```nginx
    http { 
    include mime.types; 
        
        server {
            . . .
        }
    }
    ```
    

* **location block**:This directive routes the requests to the correct location within the file system by matching the URI against the parameter . It is one of the most important directives to learn. each URL is matched against the location block to determine what content it will serve.
    
    ```nginx
    # the uri : / is the parameter to the location block.
    # users visiting localhost:8080/ would be served content from this block
    http {
        server { 
                .
                .
                location / {
                    ...
                }    
                .
                .
        }
    }
    ```
    

* **root directive**: The parameter `/draft` gets appended to the root location folder.
    
    URL gets matched against `/draft` here and then nginx serves content from the location `/users/rocky/site/draft/`
    
    ```nginx
    # users visiting localhost:8080/draft would be served content from this block
    http {
        server { 
                .
                .
                location /draft {
                    root /users/rocky/site; 
                }     
                .
                .
        }
    }
    ```
    

* **alias directive**: The parameter `/test` gets dropped and the nginx serves content from `/users/rocky/site/draft` . It allows us to remap URLs to a different directory completely other than the root location. It is useful for serving static files from a different directory
    
    ```nginx
     # users visiting localhost:8080/test would be served content from this block
    http {
        server { 
                .
                .
                location /test {
                    alias /users/rocky/site/draft; 
                }    
                .
                .
        }
    }
    ```
    

* **try\_files directive:** This directive recursively search for files in a specific order and serves the file located first. we've mentioned here `=404` meaning we don't let it run forever, if the server doesn't find the index.html in a single pass, it would throw the error 404.
    
    ```nginx
    # users visiting localhost:8080/draft would be served content from this block
    http {
        server { 
                .
                .
                location /draft {
                    try_files /drafts/index.html /default/index.html =404;
                }  
                .
                .
        }
    }
    ```
    
* **redirect and rewrite directives**: if a user wants to go to `/final` but we want the page to redirect to `/draft` it is very simple to do. Look at the below example to achieve this.
    
    ```nginx
    http {
        server { 
                .
                .
                location /final {
                    # 307 is a http redirect code 
                    # we are redirecting from final to draft
                    # users visting localhost:8080/final 
                    # would be redirected to localhost:8080/draft
                    return 307  /draft
                }  
                .
                .
        }
    }
    ```
    
    In the previous example if you observe the URL changes from `/final` to `/draft` but what if we don't want the URL to change, this kind of behaviour is where we can make use of the `rewrite` directive. Look at the below example to achieve this
    
    ```nginx
    http {
        server { 
                .
                .
                # anybody visiting localhost:8080/final 
                # will be redirected to /draft 
                # but the url will remain the same i.e. localhost:8080/final
                rewrite ^/final? /draft break; 
                location /draft {
                    ...
                }  
                .
                .
        }
    }
    ```
    

These are just a few of the directives to get you a bit familiar with nginx. Users can go through the nginx docs to learn in-depth about the intricacies of the nginx [here](http://docs.nginx.com)

### References

* [Laith Academy at youtube](https://www.youtube.com/watch?v=7VAI73roXaY&list=RDCMUCyLNhHSiEVkVwPSFKxJAfSA&index=1).