Ne e ngremë shembullin tonë të Webogram-it me proxying nëpërmjet nginx

Hej Habr!

Kohët e fundit u gjenda në një situatë në të cilën ishte e nevojshme të punoja brenda një rrjeti korporativ me qasje jo të plotë në internet dhe, siç mund ta merrni me mend nga titulli, Telegram ishte i bllokuar në të. Jam i sigurt se kjo situatë është e njohur për shumë njerëz.

Mund të bëj pa mesazhe të çastit, por ishte Telegrami që më duhej për punë. Nuk ishte e mundur të instalohej klienti në një makinë pune dhe as të përdorej një laptop personal. Një zgjidhje tjetër duket se është përdorimi i tij versioni zyrtar i uebit, por siç mund ta merrni me mend, ishte gjithashtu i padisponueshëm. Unë e kaloj menjëherë mundësinë e kërkimit të një pasqyre jozyrtare (shpresoj për arsye të dukshme).

Për fat të mirë, Webogram është një projekt me burim të hapur, kodi burimor i të cilit është i disponueshëm në Github autori i saj (Për të cilin shumë faleminderit!)
Instalimi dhe nisja në vetvete nuk është e vështirë, megjithatë, në kushtet e funksionimit brenda një rrjeti me akses të bllokuar në serverët e Telegram, do të keni më shumë gjasa të zhgënjeheni sesa të suksesshëm, pasi versioni në internet dërgon kërkesa në serverët e Telegram nga makina e përdoruesit.

Për fat të mirë, ky është një rregullim mjaft i thjeshtë (por jo shumë i dukshëm). Dua t'ju paralajmëroj se nuk jam unë autori i kësaj zgjidhjeje. Arrita ta gjej në degë, i cili diskutoi një problem të ngjashëm me timin. Zgjidhja e sugjeruar nga përdoruesi i github tecknojock, më ndihmoi shumë, megjithatë, jam i sigurt se mund të ndihmojë dikë tjetër, kështu që vendosa të shkruaj këtë tutorial.

Nën prerjen do të gjeni konfigurimin hap pas hapi të pasqyrës suaj të Webogram dhe konfigurimin e proksimit të kërkesave të tij në serverët e Telegram duke përdorur nginx.

Si shembull, zgjodha një Server Ubuntu 18.04.3 të sapo instaluar dhe të përditësuar.

Warning: Ky tutorial nuk do të përmbajë udhëzime për konfigurimin e një domeni në nginx. Ju duhet ta bëni këtë vetë. Tutoriali supozon që ju keni konfiguruar tashmë një domen me ssl dhe se vetë serveri në të cilin planifikoni ta konfiguroni ka qasje në serverët e Telegram (në çfarëdo mënyre që ju pëlqen)

Le të supozojmë se ip-ja e këtij serveri është 10.23.0.3 dhe emri i domenit është mywebogram.localhost

Bazuar në këto konventa, unë do të jap shembuj të konfigurimeve. Mos harroni të ndryshoni vlerat në tuajat.

Pra, le të fillojmë:

Për të ekzekutuar Webogram, na duhen nodejs. Si parazgjedhje, nëse e instalojmë nga magazinat e Ubuntu, do të marrim versionin 8.x të nodejs. Ne kemi nevojë për 12.x:

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

Ne zgjedhim vendin ku do të bazohet uebgrami ynë.

Për shembull, le ta vendosim atë në rrënjën e drejtorisë kryesore. Për ta bërë këtë, klononi depon zyrtare në serverin tonë:

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

Hapi tjetër është të instaloni të gjitha varësitë e nevojshme për të ekzekutuar aplikacionin:

cd webogram && npm install

Le të provojmë një test test. Ekzekutoni komandën:

npm start

Pas kësaj, ne përpiqemi ta hapim atë në shfletues

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

Nëse deri në këtë pikë keni bërë gjithçka në mënyrë korrekte, faqja e autorizimit të Webogram do të hapet.

Tani duhet të konfigurojmë aplikacionin që të funksionojë si shërbim. Për ta bërë këtë, le të krijojmë një skedar

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

hapeni atë në çdo redaktues dhe jepni pamjen e mëposhtme (futni rrugën tuaj për në 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

Pastaj ekzekutojmë komandat e mëposhtme:

Aplikimi i ndryshimeve

sudo systemctl daemon-reload

Aktivizo autorun:

sudo systemctl enable webogram.service

Le të fillojmë shërbimin:

sudo systemctl start webogram.service

Pas përfundimit të hapave, Webogram do të vazhdojë të jetë i disponueshëm në portin 8000.

Meqenëse do të konfigurojmë aksesin në Webogramin tonë nëpërmjet nginx, ne do të mbyllim portin 8000 për kërkesat nga jashtë.

Ne përdorim mjetin udf për këtë (ose ndonjë metodë të përshtatshme për ju):

sudo ufw deny 8000

Në rast se ende vendosni të përdorni udf, por është i çaktivizuar në server, shtoni më shumë rregulla (në mënyrë që gjithçka të mos prishet) dhe aktivizoni udf-në:

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

Më pas, le të fillojmë të ndryshojmë konfigurimin e nginx.

Siç paralajmërova më lart, supozohet se një domen me ssl është konfiguruar tashmë në serverin tuaj. Unë do të tërheq vëmendjen tuaj vetëm për atë që do të duhet të shtohet në skedarin e konfigurimit të domenit që ai të funksionojë siç duhet:


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;
  }
}

Çfarë i shtojmë konfigurimit nginx:

  • Ne ndryshojmë vendndodhjen rrënjësore, e cila do të proxy kërkesat në portin 8000, në të cilën Webogram përgjigjet
  • Ne mbyllim vendndodhjen e rrënjës duke përdorur basic-auth. Ky është një hap thjesht simbolik për të mbyllur aplikacionin tonë nga sytë kureshtarë dhe robotët. (Dhe gjithashtu për të shmangur problemet me bllokimin)
  • Një mori vendndodhjesh me proxy_path në serverin e Telegram janë pikërisht pikat tona fundore përmes të cilave ne do të përcaktojmë kërkesat tona

Gjithashtu, le të krijojmë një skedar /etc/nginx/passwd.htpasswd;në mënyrë që nginx të ketë diçka për të kontrolluar fjalëkalimet e përdoruesve.

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

Ne e ngremë shembullin tonë të Webogram-it me proxying nëpërmjet nginx

Rinisni nginx:

sudo systemctl restart nginx

Tani Webogram do të jetë i disponueshëm vetëm në mywebogram.localhost/app/index.html pasi futen hyrjen dhe fjalëkalimin që keni përcaktuar gjatë krijimit të komandës htpasswd.

Ka mbetur pak: do të bëjmë ndryshime të vogla në vetë projektin.

Hapni skedarin në një redaktues ~/webogram/app/js/lib/mtproto.js

Dhe sillni fillimin e tij në formën e mëposhtme:

/*!
 * 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
      }
...
 

Pas kësaj, duhet të rifreskoni faqen e aplikacionit në shfletues.

Hapni tastierën tuaj të shfletuesit dhe shikoni kërkesat e rrjetit të aplikacionit. Nëse gjithçka funksionon dhe kërkesat XHR shkojnë në serverin tuaj, atëherë gjithçka është bërë në mënyrë korrekte dhe Webogram tani është proksiuar përmes nginx.

Ne e ngremë shembullin tonë të Webogram-it me proxying nëpërmjet nginx

Shpresoj që ky tutorial të jetë i dobishëm për dikë tjetër përveç meje.

Shumë faleminderit për të gjithë ata që lexuan deri në fund.

Nëse dikush ka ndonjë vështirësi ose kam bërë ndonjë pasaktësi, me kënaqësi do të përgjigjem dhe do të përpiqem t'ju ndihmoj në komente ose në PM.

Burimi: www.habr.com

Shto një koment