Бид nginx-ээр дамжуулан прокси ашиглан Webogram instance-ээ хөгжүүлдэг

Хөөе Хабр!

Саяхан би интернетэд бүрэн нэвтрэх боломжгүй корпорацийн сүлжээнд ажиллах шаардлагатай нөхцөл байдалд орсон бөгөөд гарчигнаас нь харахад Telegram-ыг хаасан байна. Энэ байдал олон хүнд танил болсон гэдэгт итгэлтэй байна.

Би шуурхай мессенжергүйгээр хийж чадна, гэхдээ ажилд Telegram хэрэгтэй байсан. Үйлчлүүлэгчийг ажлын машин дээр суулгах боломжгүй, хувийн зөөврийн компьютер ашиглах боломжгүй байсан. Өөр нэг шийдэл бол үүнийг ашиглах явдал юм албан ёсны вэб хувилбар, гэхдээ таны таамаглаж байгаагаар энэ нь бас боломжгүй байсан. Би албан бус толин тусгалыг хайх сонголтыг шууд хасч (тодорхой шалтгаантай гэж найдаж байна).

Аз болоход Webogram бол нээлттэй эхийн төсөл бөгөөд эх кодыг нь ашиглах боломжтой github түүний зохиогч (Үүний төлөө түүнд маш их баярлалаа!)
Суулгах, эхлүүлэх нь өөрөө тийм ч хэцүү биш боловч Telegram серверт хандах хандалтыг хаасан сүлжээнд ажиллах тохиолдолд вэб хувилбар нь хэрэглэгчийн машинаас Telegram сервер рүү хүсэлт илгээдэг тул амжилтанд хүрэхээсээ илүү сэтгэл дундуур байх болно.

Аз болоход, энэ нь нэлээд энгийн (гэхдээ тийм ч тодорхой биш) засвар юм. Би энэ шийдлийн зохиогч биш гэдгийг анхааруулмаар байна. Би үүнийг дотроос нь олж чадсан салбар, минийхтэй төстэй асуудлын талаар ярилцсан. Github хэрэглэгчийн санал болгосон шийдэл текножок, энэ нь надад маш их тусалсан, гэхдээ энэ нь өөр хэн нэгэнд тусалж чадна гэдэгт итгэлтэй байгаа тул би энэ хичээлийг бичихээр шийдсэн.

Тайлбарын доор та өөрийн Webogram толин тусгалыг алхам алхмаар тохируулж, nginx ашиглан Telegram серверт хүсэлтээ илгээх тохиргоог олох болно.

Жишээлбэл, би шинээр суулгаж, шинэчлэгдсэн Ubuntu Server 18.04.3-ийг сонгосон.

Анхааруулга: Энэ зааварт nginx дээр домэйн тохируулах зааврыг оруулахгүй. Та үүнийг өөрөө хийх хэрэгтэй. Энэхүү заавар нь таныг аль хэдийн ssl-тэй домэйныг тохируулсан бөгөөд үүнийг тохируулахаар төлөвлөж буй сервер өөрөө Telegram серверт хандах боломжтой (таны хүссэн хэлбэрээр) гэж үздэг.

Энэ серверийн IP нь 10.23.0.3, домайн нэр нь mywebogram.localhost гэж бодъё.

Эдгээр конвенцид үндэслэн би тохиргооны жишээг өгөх болно. Үнэт зүйлсийг өөрийнхөөрөө өөрчлөхөө бүү мартаарай.

Тиймээс эхлүүлье:

Webogram ажиллуулахын тулд бидэнд nodejs хэрэгтэй. Анхдагч байдлаар, хэрэв бид үүнийг Ubuntu репозитороос суулгавал nodejs 8.x хувилбарыг авах болно. Бидэнд 12.x хэрэгтэй:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 
sudo apt update && sudo apt -y install nodejs

Бид вэбограммаа байрлуулах газрыг сонгодог.

Жишээлбэл, үүнийг гэрийн лавлахын үндсэн хэсэгт байрлуулъя. Үүнийг хийхийн тулд албан ёсны репозиторийг манай серверт клон хийнэ үү:

cd ~ && git clone https://github.com/zhukov/webogram.git

Дараагийн алхам бол програмыг ажиллуулахад шаардлагатай бүх хамаарлыг суулгах явдал юм.

cd webogram && npm install

Туршилт хийж үзье. Командыг ажиллуулна уу:

npm start

Үүний дараа бид үүнийг хөтөч дээр нээхийг оролддог

 http://10.23.0.3:8000/app/index.html

Хэрэв та энэ хүртэл бүх зүйлийг зөв хийсэн бол Webogram зөвшөөрлийн хуудас нээгдэнэ.

Одоо бид програмыг үйлчилгээ болгон ажиллуулахаар тохируулах хэрэгтэй. Үүнийг хийхийн тулд файл үүсгэцгээе

sudo touch /lib/systemd/system/webogram.service

Үүнийг дурын редактор дээр нээгээд дараах дүр төрхийг өгнө үү (WorkDirectory руу орох замаа оруулна уу)

[Unit]
Description=Webogram mirror
[Service]
WorkingDirectory=/home/tg/webogram
ExecStart=/usr/bin/npm start
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Дараа нь бид дараах тушаалуудыг ажиллуулна:

Өөрчлөлтүүдийг хэрэгжүүлж байна

sudo systemctl daemon-reload

Автоматаар ажиллуулахыг идэвхжүүлэх:

sudo systemctl enable webogram.service

Үйлчилгээг эхлүүлье:

sudo systemctl start webogram.service

Алхамуудыг гүйцэтгэсний дараа Webogram 8000 порт дээр үргэлжлүүлэн ажиллах болно.

Бид nginx-ээр дамжуулан Вебограм руугаа нэвтрэх боломжийг тохируулах тул гаднаас ирсэн хүсэлтийн хувьд 8000 портыг хаах болно.

Үүний тулд бид udf хэрэгслийг (эсвэл танд тохиромжтой аргыг) ашигладаг.

sudo ufw deny 8000

Хэрэв та udf-г ашиглахаар шийдсэн хэвээр байгаа ч сервер дээр идэвхгүй болсон бол нэмэлт дүрэм нэмж (бүх зүйл задрахгүй байхын тулд) udf-г идэвхжүүлнэ үү:

sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

Дараа нь nginx тохиргоог өөрчилж эхэлцгээе.

Дээр дурдсанчлан ssl-тэй домэйн таны сервер дээр аль хэдийн тохируулагдсан байна гэж таамаглаж байна. Домэйн тохиргооны файлыг зөв ажиллуулахын тулд юу нэмэх шаардлагатайг би зөвхөн анхаарлаа хандуулах болно.


server {
...
  location ^~ /pluto/apiw1/ {
    proxy_pass https://pluto.web.telegram.org/apiw1/;
  }
  location ^~ /venus/apiw1/ {
    proxy_pass https://venus.web.telegram.org/apiw1/;
  }
  location ^~ /aurora/apiw1/ {
    proxy_pass https://aurora.web.telegram.org/apiw1/;
  }
  location ^~ /vesta/apiw1/ {
    proxy_pass https://vesta.web.telegram.org/apiw1/;
  }
  location ^~ /flora/apiw1/ {
    proxy_pass https://flora.web.telegram.org/apiw1/;
  }
  location ^~ /pluto-1/apiw1/ {
    proxy_pass https://pluto-1.web.telegram.org/apiw1/;
  }
  location ^~ /venus-1/apiw1/ {
    proxy_pass https://venus-1.web.telegram.org/apiw1/;
  }
  location ^~ /aurora-1/apiw1/ {
    proxy_pass https://aurora-1.web.telegram.org/apiw1/;
  }
  location ^~ /vesta-1/apiw1/ {
    proxy_pass https://vesta-1.web.telegram.org/apiw1/;
  }
  location ^~ /flora-1/apiw1/ {
    proxy_pass https://flora-1.web.telegram.org/apiw1/;
  }
  location ^~ /DC1/ {
    proxy_pass http://149.154.175.10:80/;
  }
  location ^~ /DC2/ {
    proxy_pass http://149.154.167.40:80/;
  }
  location ^~ /DC3/ {
    proxy_pass http://149.154.175.117:80/;
  }
  location ^~ /DC4/ {
    proxy_pass http://149.154.175.50:80/;
  }
  location ^~ /DC5/ {
    proxy_pass http://149.154.167.51:80/;
  }
  location ^~ /DC6/ {
    proxy_pass http://149.154.175.100:80/;
  }
  location ^~ /DC7/ {
    proxy_pass http://149.154.167.91:80/;
  }
  location ^~ /DC8/ {
    proxy_pass http://149.154.171.5:80/;
  }
 location / {
    auth_basic "tg";
    auth_basic_user_file /etc/nginx/passwd.htpasswd;
    proxy_pass http://localhost:8000/;
    proxy_read_timeout 90s;
    proxy_connect_timeout 90s;
    proxy_send_timeout 90s;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

Nginx тохиргоонд юу нэмэх вэ:

  • Бид эх байршлыг өөрчилдөг бөгөөд энэ нь Webogram-аас хариу өгөх 8000 порт руу хүсэлт илгээх болно
  • Бид basic-auth ашиглан үндсэн байршлыг хаадаг. Энэ бол бидний аппликейшнийг сониуч нүд, роботоос хаах цэвэр бэлгэдлийн алхам юм. (Мөн блоклохтой холбоотой асуудлаас зайлсхийхийн тулд)
  • Telegram сервер дээрх proxy_path бүхий хэд хэдэн байршил нь бидний хүсэлтийг проксигаар дамжуулах эцсийн цэгүүд юм.

Мөн файл үүсгэцгээе /etc/nginx/passwd.htpasswd;Ингэснээр nginx-д хэрэглэгчийн нууц үгийг шалгах зүйл бий.

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg

Бид nginx-ээр дамжуулан прокси ашиглан Webogram instance-ээ хөгжүүлдэг

Nginx-г дахин эхлүүлэх:

sudo systemctl restart nginx

Одоо Webogram зөвхөн хаягаар л боломжтой болно mywebogram.localhost/app/index.html htpasswd командыг үүсгэх үед тодорхойлсон нэвтрэх болон нууц үгээ оруулсны дараа.

Цөөн үлдлээ: бид төсөлдөө жижиг өөрчлөлт хийх болно.

Файлыг засварлагчаар нээнэ үү ~/webogram/app/js/lib/mtproto.js

Мөн түүний эхлэлийг дараах хэлбэрт оруулаарай.

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <[email protected]>
 * https://github.com/zhukov/webogram/blob/master/LICENSE
 */

angular.module('izhukov.mtproto', ['izhukov.utils'])

  .factory('MtpDcConfigurator', function () {
    var sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora']

    var dcOptions = Config.Modes.test
      ? [
        {id: 1, host: 'mywebogram.localhost/DC1',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC2',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC3', port: 80}
      ]
      : [
        {id: 1, host: 'mywebogram.localhost/DC4',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC5',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC6', port: 80},
        {id: 4, host: 'mywebogram.localhost/DC7',  port: 80},
        {id: 5, host: 'mywebogram.localhost/DC8',   port: 80}
      ]

    var chosenServers = {}

    function chooseServer (dcID, upload) {
      if (chosenServers[dcID] === undefined) {
        var chosenServer = false,
          i, dcOption

        if (Config.Modes.ssl || !Config.Modes.http) {
          var subdomain = sslSubdomains[dcID - 1] + (upload ? '-1' : '')
          var path = Config.Modes.test ? 'apiw_test1' : '/apiw1/'
          chosenServer = 'https://mywebogram.localhost/' + subdomain + path
          return chosenServer
        }
       for (i = 0; i < dcOptions.length; i++) {
          dcOption = dcOptions[i]
          if (dcOption.id == dcID) {
            chosenServer = 'http://' + dcOption.host + '/apiw1'
            break
          }
        }
        chosenServers[dcID] = chosenServer
      }
...
 

Үүний дараа та хөтөч дээрх програмын хуудсыг шинэчлэх хэрэгтэй.

Хөтөчийнхөө консолыг нээж, програмын сүлжээний хүсэлтийг харна уу. Хэрэв бүх зүйл ажиллаж, XHR хүсэлтүүд таны серверт очвол бүх зүйл зөв хийгдсэн бөгөөд Webogram одоо nginx-ээр дамжуулан проксид холбогдсон байна.

Бид nginx-ээр дамжуулан прокси ашиглан Webogram instance-ээ хөгжүүлдэг

Энэ заавар надаас өөр хэн нэгэнд хэрэг болно гэж найдаж байна.

Дуустал нь уншсан бүх хүмүүст маш их баярлалаа.

Хэрэв хэн нэгэнд ямар нэгэн бэрхшээл тулгарсан эсвэл би алдаа гаргасан бол би хариулахдаа баяртай байх болно, коммент эсвэл PM-ээр танд туслах болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх