Nginx-ээс Envoy Proxy руу шилжих

Сайн уу, Хабр! Би та бүхэнд нийтлэлийн орчуулгыг хүргэж байна. Nginx-ээс Envoy Proxy руу шилжих.

Envoy нь хувь хүний ​​үйлчилгээ болон програмуудад зориулагдсан өндөр хүчин чадалтай хуваарилагдсан прокси сервер (C++ хэл дээр бичигдсэн) бөгөөд энэ нь мөн томоохон микро үйлчилгээний "үйлчилгээний тор" архитектурт зориулагдсан холбооны автобус ба "бүх нийтийн мэдээллийн хавтгай" юм. Үүнийг бүтээхдээ NGINX, HAProxy, техник хангамжийн ачаалал тэнцвэржүүлэгч, үүлэн ачааллын тэнцвэржүүлэгч гэх мэт серверүүдийг хөгжүүлэх явцад үүссэн асуудлуудын шийдлүүдийг харгалзан үзсэн. Элч программ бүртэй зэрэгцэн ажиллаж, платформоос үл хамааран нийтлэг функцээр хангахын тулд сүлжээг хийсвэрлэдэг. Дэд бүтцийн бүх үйлчилгээний урсгал Envoy сүлжээгээр урсах үед байнгын ажиглалтаар асуудалтай газруудыг дүрслэн харуулах, ерөнхий гүйцэтгэлийг тохируулах, тодорхой байршилд үндсэн функцийг нэмэхэд хялбар болно.

Онцлог

  • Процессын гадуурх архитектур: элч нь бие даасан, бага хэмжээний RAM эзэлдэг өндөр хүчин чадалтай сервер юм. Энэ нь ямар ч програмын хэл эсвэл хүрээтэй хамт ажилладаг.
  • http/2 болон grpc дэмжлэг: элч нь ирж буй болон гарах холболтын хувьд нэгдүгээр зэрэглэлийн http/2 болон grpc дэмжлэгтэй. Энэ нь http/1.1-ээс http/2 хүртэлх ил тод прокси юм.
  • Нарийвчилсан ачааллыг тэнцвэржүүлэх: элч нь автоматаар дахин оролдох, гинжийг таслах, дэлхийн хурдыг хязгаарлах, хүсэлтийн сүүдэрлэх, орон нутгийн бүсийн ачааллыг тэнцвэржүүлэх гэх мэт ачааллыг тэнцвэржүүлэх дэвшилтэт функцуудыг дэмждэг.
  • Тохиргооны удирдлагын API: элч нь таны тохиргоог динамикаар удирдах найдвартай API-г өгдөг.
  • Ажиглах боломжтой байдал: L7 траффикийн гүн гүнзгий ажиглалт, тархсан мөшгих эх дэмжлэг, mongodb, dynamodb болон бусад олон програмуудыг ажиглах боломжтой.

Алхам 1 - Жишээ нь NGINX тохиргоо

Энэ скрипт нь тусгайлан боловсруулсан файлыг ашигладаг nginx.conf-аас авсан бүрэн жишээн дээр үндэслэсэн NGINX Wiki. Та засварлагчийн тохиргоог нээх замаар харах боломжтой nginx.conf

nginx эх сурвалжийн тохиргоо

user  www www;
pid /var/run/nginx.pid;
worker_processes  2;

events {
  worker_connections   2000;
}

http {
  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  log_format main      '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

  server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

    access_log   /var/log/nginx.access_log  main;
    error_log  /var/log/nginx.error_log  info;

    location / {
      proxy_pass         http://targetCluster/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
    }
  }
}

NGINX тохиргоо нь ихэвчлэн гурван үндсэн элементтэй байдаг:

  1. NGINX сервер, бүртгэлийн бүтэц, Gzip функцийг тохируулж байна. Энэ нь бүх тохиолдолд дэлхий даяар тодорхойлогддог.
  2. NGINX-г хост руу илгээсэн хүсэлтийг хүлээн авахаар тохируулж байна one.example.com 8080 порт дээр.
  3. Зорилтот байршлыг тохируулах, URL-ийн өөр өөр хэсгүүдийн урсгалыг хэрхэн зохицуулах.

Бүх тохиргоо Envoy Proxy-д хамаарахгүй бөгөөд та зарим тохиргоог хийх шаардлагагүй. Төлөөлөгчийн төлөөлөгч дөрвөн үндсэн төрөлNGINX-ийн санал болгож буй үндсэн дэд бүтцийг дэмждэг. Гол нь:

  • Сонсогчид: Тэд Envoy Proxy ирж буй хүсэлтийг хэрхэн хүлээж авахыг тодорхойлдог. Envoy Proxy одоогоор зөвхөн TCP-д суурилсан сонсогчдыг дэмждэг. Холболт хийгдсэний дараа түүнийг боловсруулахад зориулж шүүлтүүрийн багц руу дамжуулдаг.
  • Шүүлтүүр: Эдгээр нь ирж буй болон гарч буй өгөгдлийг боловсруулах боломжтой дамжуулах хоолойн архитектурын нэг хэсэг юм. Энэ функцэд Gzip гэх мэт шүүлтүүрүүд багтдаг бөгөөд энэ нь өгөгдлийг үйлчлүүлэгч рүү илгээхээс өмнө шахдаг.
  • Чиглүүлэгчид: Тэд урсгалыг кластер гэж тодорхойлсон шаардлагатай газар руу шилжүүлдэг.
  • Кластерууд: Тэд замын хөдөлгөөн болон тохиргооны параметрүүдийн төгсгөлийн цэгийг тодорхойлдог.

Бид эдгээр дөрвөн бүрэлдэхүүн хэсгийг ашиглан NGINX-ийн тодорхой тохиргоонд тохирох Envoy Proxy тохиргоог үүсгэх болно. Элч төлөөлөгчийн зорилго нь API болон динамик тохиргоотой ажиллах явдал юм. Энэ тохиолдолд үндсэн тохиргоо нь NGINX-ийн статик, хатуу кодлогдсон тохиргоог ашиглана.

Алхам 2 - NGINX тохиргоо

Нэгдүгээр хэсэг nginx.conf тохируулах шаардлагатай зарим NGINX дотоод хэсгүүдийг тодорхойлдог.

Ажилчдын холболтууд

Доорх тохиргоо нь ажилчдын үйл явц болон холболтын тоог тодорхойлдог. Энэ нь NGINX эрэлт хэрэгцээг хэрхэн хангахыг харуулж байна.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy нь ажлын урсгал болон холболтыг янз бүрийн аргаар удирддаг.

Элч нь систем дэх техник хангамжийн хэлхээ бүрт ажилчны утас үүсгэдэг. Ажилчны утас бүр нь блоклохгүй үйл явдлын давталтыг гүйцэтгэдэг

  1. Сонсогч бүрийг сонсох
  2. Шинэ холболтыг хүлээн авах
  3. Холболтын шүүлтүүрийн багц үүсгэх
  4. Холболтын ашиглалтын хугацаанд бүх I/O үйлдлийг боловсруулна.

Цаашдын бүх холболтын боловсруулалтыг бүхэлд нь ажилчны хэлхээнд, түүний дотор дамжуулалтын үйлдлийг гүйцэтгэдэг.

Envoy дахь ажилчны утас бүрийн хувьд холболтын сан байдаг. Тиймээс HTTP/2 холболтын сан нь гадаад хост бүрт нэг удаад зөвхөн нэг холболт үүсгэдэг бөгөөд хэрэв дөрвөн ажилчин хэлхээтэй бол гадаад хост бүрт дөрвөн HTTP/2 холболт тогтвортой төлөвт байх болно. Бүх зүйлийг нэг ажилчны хэлхээнд хадгалснаар бараг бүх кодыг блоклохгүйгээр нэг урсгалтай мэт бичиж болно. Хэрэв шаардлагатай хэмжээнээс илүү олон ажилчны утас хуваарилагдсан бол энэ нь санах ойг дэмий үрж, олон тооны сул холболт үүсгэж, холболтыг усан сан руу буцаах тоог багасгахад хүргэдэг.

Для получения дополнительной мэдээлэл пасетите Envoy Proxy блог.

HTTP тохиргоо

Дараах NGINX тохиргооны блок нь HTTP тохиргоог тодорхойлдог, тухайлбал:

  • Ямар төрлийн MIME дэмждэг вэ
  • Өгөгдмөл хугацаа
  • Gzip тохиргоо

Та Envoy Proxy дээрх шүүлтүүрүүдийг ашиглан эдгээр талыг өөрчлөх боломжтой бөгөөд бид үүнийг дараа хэлэлцэх болно.

Алхам 3 - Серверийн тохиргоо

HTTP тохиргооны блок дахь NGINX тохиргоо нь 8080 портыг сонсож, домэйны хүсэлтэд хариу өгөхийг зааж өгдөг. one.example.com и www.one.example.com.

 server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

Inside Envoy, үүнийг Сонсогчид удирддаг.

Элч сонсогчид

Envoy Proxy-г эхлүүлэх хамгийн чухал тал бол сонсогчдоо тодорхойлох явдал юм. Та Envoy жишээг хэрхэн ажиллуулахыг хүссэн тохиргооны файлыг үүсгэх хэрэгтэй.

Доорх хэсэг нь шинэ сонсогч үүсгэж, түүнийг 8080 порт руу холбох болно. Тохиргоо нь Envoy Proxy-д ирж буй хүсэлтэд аль портуудтай холбогдохыг зааж өгнө.

Envoy Proxy тохиргоонд YAML тэмдэглэгээг ашигладаг. Энэ тэмдэглэгээний танилцуулгыг эндээс харна уу холбоос.

Copy to Editorstatic_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }

Тодорхойлох шаардлагагүй серверийн нэр, учир нь Envoy Proxy шүүлтүүрүүд үүнийг зохицуулах болно.

Алхам 4 - Байршлын тохиргоо

NGINX-д хүсэлт ирэх үед байршлын блок нь траффикийг хэрхэн боловсруулах, хаашаа чиглүүлэхийг тодорхойлдог. Дараах фрагмент дээр сайт руу чиглэсэн бүх урсгалыг дээд урсгалын (орчуулагчийн тэмдэглэл: дээд урсгал нь ихэвчлэн програмын сервер) нэртэй кластер руу шилжүүлдэг. зорилтот кластер. Дээд талын кластер нь хүсэлтийг боловсруулах ёстой зангилааг тодорхойлдог. Бид дараагийн алхамд энэ талаар ярилцах болно.

location / {
    proxy_pass         http://targetCluster/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Envoy дээр Filters үүнийг хийдэг.

Төлөөлөгчийн шүүлтүүр

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

Copy to Editor    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router

нэр элч.http_холболтын_менежер нь Envoy Proxy-д суурилуулсан шүүлтүүр юм. Бусад шүүлтүүрүүд орно Redis, mongo, TCP. Та бүрэн жагсаалтыг эндээс авах боломжтой баримт бичиг.

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

Алхам 5 - Прокси ба дээд урсгалын тохиргоо

NGINX-д урсгалын дээд тохиргоо нь урсгалыг боловсруулах зорилтот серверүүдийн багцыг тодорхойлдог. Энэ тохиолдолд хоёр кластер хуваарилагдсан.

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

Envoy-д үүнийг кластерууд удирддаг.

Төлөөлөгчийн кластерууд

Дээд талын эквивалентийг кластер гэж тодорхойлдог. Энэ тохиолдолд замын хөдөлгөөнд үйлчлэх хостууд тодорхойлогдсон. Хүлээн авах хугацаа гэх мэт хостуудад хандах арга нь кластерийн тохиргоо гэж тодорхойлогддог. Энэ нь хоцролт, ачааллыг тэнцвэржүүлэх зэрэг асуудлуудыг илүү нарийн хянах боломжийг олгодог.

Copy to Editor  clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

Үйлчилгээний нээлтийг ашиглах үед STRICT_DNS Элч нь заасан DNS зорилтуудыг тасралтгүй, асинхроноор шийдвэрлэх болно. DNS үр дүнгээс буцаасан IP хаяг бүрийг дээд кластерт тодорхой хост гэж үзэх болно. Энэ нь хэрэв хүсэлт нь хоёр IP хаягийг буцаавал Элч нь кластерт хоёр хост байгаа бөгөөд хоёулаа ачааллын тэнцвэртэй байх ёстой гэсэн үг юм. Хэрэв хостыг үр дүнгээс хасвал Элч түүнийг байхгүй гэж үзэж, одоо байгаа холболтын сангаас траффик татах болно.

Для получения дополнительной мэдээлэл. См. Элч төлөөлөгчийн баримт бичиг.

Алхам 6 - Бүртгэлийн хандалт ба алдаа

Эцсийн тохиргоо бол бүртгэл юм. Алдааны бүртгэлийг диск рүү оруулахын оронд Envoy Proxy үүлэн дээр суурилсан хандлагыг ашигладаг. Програмын бүх бүртгэлийг дараах руу гаргадаг stdout и stderr.

Хэрэглэгчид хүсэлт гаргах үед хандалтын бүртгэл нь нэмэлт бөгөөд анхдагчаар идэвхгүй болно. HTTP хүсэлтийн хандалтын бүртгэлийг идэвхжүүлэхийн тулд тохиргоог идэвхжүүлнэ үү хандалтын_лог HTTP холболтын менежерийн хувьд. зам гэх мэт төхөөрөмж байж болно stdout, эсвэл таны шаардлагаас хамааран дискэн дээрх файл.

Дараах тохиргоо нь бүх хандалтын бүртгэлийг дахин чиглүүлэх болно stdout (орчуулагчийн тэмдэглэл - докер дотор элчийг ашиглахын тулд stdout шаардлагатай. Хэрэв докергүйгээр ашигладаг бол /dev/stdout-г ердийн бүртгэлийн файлын замаар солино уу). Хэсгийг холболтын менежерийн тохиргооны хэсэгт хуулна уу:

Copy to Clipboardaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

Үр дүн нь дараах байдлаар харагдах ёстой.

      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:

Анхдагчаар Envoy нь HTTP хүсэлтийн дэлгэрэнгүй мэдээллийг агуулсан форматын мөртэй байна:

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n

Энэ форматын мөрийн үр дүн нь:

[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"

Формат талбарыг тохируулснаар гаралтын контентыг өөрчилж болно. Жишээлбэл:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"

Мөн талбарыг тохируулснаар бүртгэлийн мөрийг JSON форматаар гаргаж болно json_формат. Жишээ нь:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

Элчийг бүртгэх аргачлалын талаар дэлгэрэнгүй мэдээлэл авахыг хүсвэл зочилно уу

https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries

Бүртгэл нь Envoy Proxy-тэй ажиллах талаар ойлголттой болох цорын ганц арга зам биш юм. Энэ нь дэвшилтэт мөрдөх болон хэмжүүрийн чадамжтай. Та илүү дэлгэрэнгүй мэдээллийг авах боломжтой мөрдөх баримт бичиг эсвэл дамжуулан Интерактив мөрдөх скрипт.

Алхам 7 - эхлүүлэх

Та одоо тохиргоогоо NGINX-ээс Envoy Proxy руу шилжүүлсэн байна. Сүүлчийн алхам бол Envoy Proxy-г туршихын тулд эхлүүлэх явдал юм.

Хэрэглэгчээр ажиллуулах

NGINX тохиргооны шугамын дээд талд хэрэглэгч www www; аюулгүй байдлыг сайжруулахын тулд NGINX-ийг давуу эрх багатай хэрэглэгчээр ажиллуулахыг заасан.

Envoy Proxy нь процессыг хэн эзэмшдэгийг удирдахын тулд үүлэнд суурилсан арга барилыг ашигладаг. Бид Envoy Proxy-г чингэлэгээр ажиллуулахдаа давуу эрх багатай хэрэглэгчийг зааж өгч болно.

Envoy Proxy-г эхлүүлж байна

Доорх команд нь Envoy Proxy-г хост дээрх Docker контейнерээр ажиллуулна. Энэ тушаал нь Envoy-д 80-р порт дээр ирж буй хүсэлтийг сонсох боломжийг олгодог. Гэсэн хэдий ч сонсогчийн тохиргоонд заасны дагуу Envoy Proxy нь 8080 порт дээр ирж буй траффикийг сонсдог. Энэ нь процессыг давуу эрх багатай хэрэглэгчээр ажиллуулах боломжийг олгодог.

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy

Тест хийх

Прокси ажиллаж байгаа тул одоо тест хийж, боловсруулж болно. Дараах cURL тушаал нь прокси тохиргоонд тодорхойлогдсон хост толгойтой хүсэлт гаргадаг.

curl -H "Host: one.example.com" localhost -i

HTTP хүсэлт нь алдаа гаргахад хүргэнэ 503. Учир нь дээд талын холболтууд ажиллахгүй, боломжгүй байна. Иймээс Envoy Proxy-д хүсэлт гаргах боломжтой газар алга. Дараах тушаал нь Envoy-д тодорхойлсон тохиргоонд тохирсон хэд хэдэн HTTP үйлчилгээг эхлүүлэх болно.

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;

Боломжтой үйлчилгээнүүдийн тусламжтайгаар Envoy трафикийг зорьсон газар руугаа амжилттай илгээх боломжтой.

curl -H "Host: one.example.com" localhost -i

Та хүсэлтийг аль Docker контейнер боловсруулсныг харуулсан хариуг харах ёстой. Envoy Proxy бүртгэлээс та хандалтын мөрийн гаралтыг харах ёстой.

Нэмэлт HTTP хариуны толгой

Та бодит хүсэлтийн хариултын толгой хэсэгт нэмэлт HTTP толгойг харах болно. Гарчиг нь дээд талын хост хүсэлтийг боловсруулахад зарцуулсан хугацааг харуулдаг. Миллисекундээр илэрхийлэгдэнэ. Үйлчлүүлэгч сүлжээний хоцрогдолтой харьцуулахад үйлчилгээний хугацааг тодорхойлохыг хүсвэл энэ нь ашигтай.

x-envoy-upstream-service-time: 0
server: envoy

Эцсийн тохиргоо

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router
          clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9090 }

Орчуулагчийн нэмэлт мэдээлэл

Envoy Proxy-г суулгах зааврыг вэбсайтаас олж болно https://www.getenvoy.io/

Анхдагч байдлаар, rpm-д системийн үйлчилгээний тохиргоо байхгүй байна.

Systemd үйлчилгээний тохиргоог нэмнэ үү /etc/systemd/system/envoy.service:

[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service

[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target

Та лавлах /etc/envoy/ үүсгээд config.yaml тохиргоог хийх хэрэгтэй.

Элч прокси ашиглан телеграм чат байна: https://t.me/envoyproxy_ru

Envoy Proxy нь статик контентоор үйлчлэхийг дэмждэггүй. Тиймээс, энэ онцлогт хэн санал өгөх боломжтой вэ: https://github.com/envoyproxy/envoy/issues/378

Зөвхөн бүртгэлтэй хэрэглэгчид санал асуулгад оролцох боломжтой. Нэвтрэх, гуйя.

Энэ нийтлэл таныг элч прокси суулгаж, туршихыг дэмжсэн үү?

  • Хэрэв тийм бол

  • ямар ч

75 хэрэглэгч санал өгсөн. 18 хэрэглэгч түдгэлзсэн.

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

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