# Nginx

## Краткие сведения

Полезная ссылка

```
http://nginx.org/ru/docs/beginners_guide.html
```

Базовый URL

```
http://localhost:8080/
```

Перезапуск

```
sudo nginx -s reload
```

Папка с файлами

```
/usr/local/etc/nginx/
```

Работаем с файлом

```
nginx.conf
```

## Создание приложения NodeJS

Напишем приложение для выполнения арифметических операций.

Приложение умеет принимать GET и POST запросы.

Приложение выставляет свои собственные заголовки.

Файл **package.json**

```
{
  "name": "app_1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.4"
  }
}
```

Файл **index.js**

```javascript
"use strict";

let express = require("express");
let app = express();

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Cache-Control", "no-cache, no-store, must-revalidate");
    res.header("My-Header-First", "F-F-F");
    res.header("My-Header-Second", "S-S-S");
    res.header("My-Header-Third", "T-T-T");
    next();
});

/*
*
*   GET: curl -vv 'http://localhost:5020/api/get/sum?a=12&b=5'
*
*/

app.get('/api/get/sum', (request, response) => {
    console.log("GET");
    const dict = request.query;
    const a = dict['a'];
    const b = dict['b'];
    const c = parseInt(a) + parseInt(b);
    response.status(200);
    response.end(c.toString());
});

/*
*
*   POST: curl -d '{"a":4, "b":25}' -vv 'http://localhost:5020/api/post/mul'
*
*/

app.post('/api/post/mul', (request, response) => {
    console.log("POST");
    const buffer = [];
    request.on('data', (data) => {
        buffer.push(data);
    }).on('end', () => {
        let bodyString = buffer.join("");
        let bodyObject = null;
        try {
            bodyObject = JSON.parse(bodyString);
        } catch (err) {
            bodyObject = null;
        }
        if(bodyObject === null) {
            response.status(400);
            response.end("");
        } else {
            const a = bodyObject.a;
            const b = bodyObject.b;
            const c = a * b;
            response.status(200);
            response.end(c.toString());
        }
    });
});

let port = 5020;
app.listen(port);
console.log("OK");
```

Запускаем приложение

```
npm start
```

Тестируем приложение.

Отправка **GET** запроса

```
curl -vv 'http://localhost:5020/api/get/sum?a=12&b=5'
```

Отправка **POST** запроса

```
curl -d '{"a":4, "b":25}' -vv 'http://localhost:5020/api/post/mul'
```

## Написание конфигурационного файла

Открываем файл **nginx.conf** и пишем

```
events {
    worker_connections 1024; 
}

http {
    server {
        listen 5010;

        location /project/app/find/sum {
            proxy_pass http://localhost:5020/api/get/sum;
        }

        location /project/app/find/mul {
            proxy_pass http://localhost:5020/api/post/mul;
        }
    }
}
```

Перезапускаем Nginx

```
sudo nginx -s reload
```

Тестируем работу Nginx

Отправляем через Nginx запрос **GET**

```
curl -vv 'http://localhost:5010/project/app/find/sum?a=45&b=15'
```

Отправляем через Nginx запрос **POST**

```
curl -d '{"a":5, "b":45}' -vv 'http://localhost:5010/project/app/find/mul'
```

При этом все заголовки от сервера **NodeJS** успешно передаются клиенту.

## Docker и Nginx

Ссылка на репозиторий

```
https://github.com/maxim218/Nginx_Docker_Apps_Test
```
