Как стать автором
Поиск
Написать публикацию
Обновить

Один из сотни способов публикации нескольких production проектов на одном сервере

Время на прочтение4 мин
Количество просмотров7.7K

image
Когда сайтов становится чуть больше чем один, а ресурсов одного сервера хватает с лихвой, встает вопрос как не переплачивать и упаковать все в одну виртуальную машину самого привлекательного сервиса, с учетом того, что когда-нибудь наши приложения разрастутся в масштабную распределенную сеть — мы обязаны заложить зернышко highload.


Описанное ниже скорее будет полезно тем, кто только начинает идти уверенными шагами в своем ремесле.


Из превьюшки видно, всю текущую архитектуру, она довольна проста, в основе лежит docker, который включает в себя


  • Nginx контейнер который смотрит во вне и проксирует все запросы
  • Много-много наших приложений, соответственно заключенных в контейнеры
  • Управление всем процессом

Настроим окружение


sudo apt update
sudo apt install docker.io
mkdir /home/$USER/app

Давайте развернем наши приложения


Добавлю небольшую помарочку, для тех кто еще мало знаком с docker, все контейнеры приложений будут запущены без доступа ко внешней среде, это очень удобно — сильно увеличивает безопасность, доступ к ним будет осуществляться только путем проксирования трафика через nginx. Вы также можете запустить для своих нужд отдельные хосты, например с MariaDB или Mongo и получить к ним доступ по локальному IP.


Первое будет на nodejs с подключенным ssl


mkdir /home/$USER/app/web-one.oyeooo.com
mkdir /home/$USER/app/web-one.oyeooo.com/ssl
nano /home/$USER/app/web-one.oyeooo.com/index.js
nano /home/$USER/app/web-one.oyeooo.com/package.json

index.js
const fs = require("fs"),
    https = require("https"),
    express = require("express"),
    app = express(),
    port = 443

let options = {
    key: fs.readFileSync("ssl/web-one.oyeooo.com.key"),
    cert: fs.readFileSync("ssl/web-one.oyeooo.com.crt")
}

https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
})

app.get("/", function (req, res) {
    res.writeHead(200)
    res.end("Oyeooo")
})

package.json
{
  "name": "oyeooo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "directories": {
    "lib": "lib"
  },
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Получаем SLL и кладем сертификаты в папку /home/app/web-one.oyeooo.com/ssl


Второе будет простое apache static приложение


mkdir /home/$USER/app/web-two.oyeooo.com
nano /home/$USER/app/web-two.oyeooo.com/index.html

index.html
<!DOCTYPE html>
<html>
    <head>
        <title>Welcome to me!</title>
    </head>
    <body>
        <h1>Oyeooo!</h1>
        <p><em>Thank you for using habr.</em></p>
    </body>
</html>

Создаем сеть


 docker network create --subnet=172.18.0.0/24 oyeooo

Теперь запускаем контейнеры


sudo docker run --net oyeooo --ip 172.18.0.2 --name web-one -v /home/$USER/app/web-one.oyeooo.com:/home/app -it node bash
cd /home/app
npm i
npm start

ctrl + q + p


sudo docker run --net oyeooo --ip 172.18.0.3 --name web-two -d -v /home/$USER/app/web-two.oyeooo.com:/usr/local/apache2/htdocs httpd

ctrl + q + p


Переходим к nginx-proxy


mkdir /home/$USER/app/nginx
mkdir /home/$USER/app/nginx/conf
mkdir /home/$USER/app/nginx/ssl
mkdir /home/$USER/app/nginx/logs
mkdir /home/$USER/app/nginx/logs/web-one.oyeooo.com
mkdir /home/$USER/app/nginx/logs/web-two.oyeooo.com
nano /home/$USER/app/nginx/conf/web-one.oyeooo.com.conf
nano /home/$USER/app/nginx/conf/web-two.oyeooo.com.conf

web-one.oyeooo.com.conf
server {
    listen 80;
    server_name web-one.oyeooo.com;
    access_log /var/log/nginx/web-one.oyeooo.com/http-access.log;
    error_log /var/log/nginx/web-one.oyeooo.com/http-error.log;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name web-one.oyeooo.com;
    access_log /var/log/nginx/web-one.oyeooo.com/https-access.log;
    error_log /var/log/nginx/web-one.oyeooo.com/https-error.log;
    ssl_certificate /etc/nginx/ssl/web-one.oyeooo.com/web-one.oyeooo.com.crt;
    ssl_certificate_key /etc/nginx/ssl/web-one.oyeooo.com/web-one.oyeooo.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

location / {
    proxy_pass https://172.18.0.2/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;

    client_max_body_size 512M;
    }
}

web-two.oyeooo.com.conf
server {
    listen 80;
    server_name web-two.oyeooo.com;
    access_log /var/log/nginx/web-two.oyeooo.com/http-access.log;
    error_log /var/log/nginx/web-two.oyeooo.com/http-error.log;

location / {
    proxy_pass http://172.18.0.3/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;

    client_max_body_size 512M;
    }
}

Разворачиваем nginx:


sudo docker run --net oyeooo --ip 172.18.0.4 --name nginx -it -v /home/$USER/app/nginx/logs:/var/log/nginx -v /home/$USER/app/nginx/ssl:/etc/nginx/ssl -v /home/$USER/app/nginx/conf:/etc/nginx/conf.d -p 80:80 -p 443:443 nginx bash
#Проверим присутствуют ли наши conf и ssl
ls /etc/nginx/conf.d
ls /etc/nginx/ssl
#Запускаем nginx
service nginx start

Окружение развернуто. Спасибо!


Регулировать наши маршруты можно файлами conf — создаем или удаляем и перезагружаем:



sudo docker exec -it nginx nginx -s reload
...
Ничего не вышло с crm, простите, на деле система все больше и больше хочет разрастись и превратиться в в gui для управления докер, которы сейчас есть. Простите.
Теги:
Хабы:
Всего голосов 17: ↑13 и ↓4+9
Комментарии17

Публикации

Ближайшие события