เปเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เบเปเบญเบเบเปเบญเบเบเบฒเบเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบชเบญเบเบฅเบฑเบเบชเบฐเบเบฐเบเบญเบ NGINX Ingress เบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเบชเบฐเปเบเบเบซเบเปเบฒเบเบงเบฒเบกเบเบดเบเบเบฒเบเบชเปเบงเบเบเบธเบเบเบปเบ, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเปเปเบเปเบฒเบเบฑเบเบเบตเปเบกเบตเบขเบนเปเปเบเบเบงเบเบกเบฑเบเปเบฅเบฐเบงเบดเบเบตเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบญเปเบญเบกเบเปเบฒเบเบเบงเบเปเบเบปเบฒ.
1. เบเบฒเบเบเปเบฝเบเปเบเบ backend เปเบฅเบตเปเบกเบเบปเปเบ
เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ, NGINX Ingress เปเบเป backend เปเบฅเบตเปเบกเบเบปเปเบ, เปเบเบดเปเบเบเบฐเบเบดเบเบฑเบเบซเบเปเบฒเบเบตเปเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบ. เบเบตเปเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเปเบกเบทเปเบญเบฎเปเบญเบเบเป Ingress เบฅเบฐเบเบธเปเบฎเบเบเบตเปเบเปเปเบขเบนเปเปเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ Ingress, เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบซเบเปเบฒเบเปเปเปเบเบเบตเปเบเปเบงเบเบฅเบฐเบซเบฑเบเบเบญเบเปเบเป 404:
เบขเปเบฒเบเปเบเบเปเปเบเบฒเบก, เปเบฅเบทเปเบญเบเปเบฅเบนเบเบเปเบฒเบเบญเบเบเบงเบเปเบฎเบปเบฒเบกเบฒเบเปเบญเบกเบเบฑเบเบเปเบฒเบฎเปเบญเบเบเปเปเบเบทเปเบญเบชเบฐเปเบเบเบซเบเปเบฒเบเบญเบเบเบงเบเปเบเบปเบฒเบเปเบงเบเปเบฅเปเบเปเบเบญเบเบเปเบฅเบดเบชเบฑเบเปเบฅเบฐเบชเบดเปเบเบญเปเบฒเบเบงเบเบเบงเบฒเบกเบชเบฐเบเบงเบเบญเบทเปเบเปเปเบเบเบเบตเปเบเบฐเปเบเบฑเบเบกเบฒเบเบเบฐเบเบฒเบ 404. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, NGINX Ingress เบกเบต default-backend-service
. เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบฅเบฒเบเบเบฒเบเบฎเบนเบเปเบเบเปเบเบฑเบเบเบฒเบเปเบเปเบเบฝเบเบเบฑเบเบเบฒเบเปเบฅเบทเบญเบเบเบญเบเบเบทเปเบเบฝเบงเบเบฑเบ namespace/servicename
. เบเบญเบเบเบญเบเบเปเบฅเบดเบเบฒเบเบเบงเบเบเบฐเปเบเบฑเบ 80.
เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบ pod เบเบญเบเบเปเบฒเบเปเบญเบ (เบเบฒเบเบเปเบฒเปเบเป) เปเบฅเบฐเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบญเบเบเปเบฒเบ (
เบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเปเบญเบเป:
~$ curl -i -XGET http://sadsdasdas.kube-cloud.my/
HTTP/1.1 404 Not Found
Date: Mon, 11 Mar 2019 05:38:15 GMT
Content-Type: */*
Transfer-Encoding: chunked
Connection: keep-alive
<span>The page you're looking for could not be found.</span>
เบเบฑเปเบเบเบฑเปเบเปเบเปเบกเบเบเบฑเบเบซเบกเบปเบเบเบตเปเบเปเปเปเบเปเบชเปเบฒเบเบขเปเบฒเบเบเบฑเบเปเบเบเปเบเบเบเปเบฒเบ YAML เบเบฑเบ kind: Ingress
, เบเบปเบเบขเบนเปเปเบ default-backend. เปเบเบฅเบฒเบเบเบทเปเบเปเบฒเบเปเบเบดเบ, เปเบเปเบกเบเบเบตเปเปเบเปเบเบฒเบเปเบเบฑเบ sadsdasdas
.
2. เบเบฒเบเบเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ HTTP เปเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเปเบเบเปเบเป backend เปเบฅเบตเปเบกเบเบปเปเบ
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบญเบทเปเบเปเบกเปเบเบเบฒเบเบฎเปเบญเบเบเปเบเบตเปเบชเบดเปเบเบชเบธเบเปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ HTTP (404, 500, 502 ... ) เบเบฑเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเบเปเปเบเปเบฒเปเบเบตเบเบเบฒเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฑเปเบเบเปเบฒเบง (เบซเบเปเบฒเบเบตเปเบชเบงเบเบเบฒเบกเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบเบเปเปเปเบเปเบเบทเบเบชเปเบฒเบเบเบถเปเบ). เบเบตเปเบญเบฒเบเบเบฐเปเบเบฑเบเบเปเบญเบเบเบงเบฒเบกเบเบฒเบเบฐเบซเบเบฒเบเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเบเบฐเบฎเบฑเบเปเบเปเบซเบเปเบฒเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบฝเบงเบเบฑเบเปเบเบซเบผเบฒเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ.
เปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเปเบฅเบฐเบเบตเบเบตเปเปเบเบเปเบฒเบเปเบเบตเบเปเบงเบตเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบ:
- เบเบฐเบเบดเบเบฑเบเบเบฒเบกเบเปเบฒเปเบเบฐเบเปเบฒเบเปเบฒเบเปเบเบดเบเบเบฒเบเบงเบฑเบเบเปเบฝเบงเบเบฑเบ backend เปเบฅเบตเปเบกเบเบปเปเบ;
- เปเบเบตเปเบกเบเบฐเปเบเปเบชเปเบเบฒเบเบเบฑเปเบเบเปเบฒ nginx-ingress ConfigMap
custom-http-errors
, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เบเบฑเบเบกเบนเบเบเปเบฒ404,503
(เปเบเปเบเบญเบเบเบปเบเบเบฑเบเบเบฑเบเบฅเบฐเบซเบฑเบเบเปเปเบเบดเบเบเบฒเบเบเบตเปเบเบทเบเบเบธเปเบกเบเบญเบเปเบเบเบเบปเบเบฅเบฐเบเบฝเบเปเบซเบกเป).
เบเบปเบเปเบเปเบฎเบฑเบเบเบตเปเบเบฒเบเปเบงเปเปเบกเปเบเบเบฑเบเบฅเบธเปเบเป: เปเบกเบทเปเบญเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบญเบเบฅเบนเบเบเปเบฒเบเปเบฒเบฅเบฑเบเปเบฅเปเบเปเบฅเบฐเปเบเปเบฎเบฑเบเบเปเปเบเบดเบเบเบฒเบเบเบตเปเบกเบตเบฅเบฐเบซเบฑเบเบเบญเบเบชเบฐเบซเบเบญเบเบเบญเบ 404 เบซเบผเบท 503, เบเปเบฒเบฎเปเบญเบเบเปเบเบฐเบเบทเบเปเบญเบเปเบเบซเบฒ backend เปเบฅเบตเปเบกเบเบปเปเบเปเบซเบกเปเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบ ...
เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเปเบงเบฅเบฒเบเบตเปเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบชเปเบฒเบฅเบฑเบ backend เปเบฅเบตเปเบกเบเบปเปเบเปเบฅเบฐ custom-http-errors, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเบดเบเบฒเบฅเบฐเบเบฒเบเบธเบเบเบฐเบชเบปเบกเบเบฑเบเบเบตเปเบชเปเบฒเบเบฑเบ:
!!! Important The custom backend is expected to return the correct HTTP status code instead of 200. NGINX does not change the response from the custom default backend.
เบเบงเบฒเบกเบเบดเบเปเบฅเปเบงเปเบกเปเบเบงเปเบฒเปเบกเบทเปเบญเบเปเบฒเบฎเปเบญเบเบเปเบเบทเบเบเปเบฝเบเปเบชเบฑเปเบเบเบฒเบ, headers เบเบฐเบกเบตเบเปเปเบกเบนเบเบเบตเปเปเบเบฑเบเบเบฐเปเบซเบเบเบเบฑเบเบฅเบฐเบซเบฑเบเบเบญเบเบชเบฐเบซเบเบญเบเบเบตเปเบเปเบฒเบเบกเบฒเปเบฅเบฐเบเปเปเบกเบนเบเปเบเบตเปเบกเปเบเบตเบก (เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเปเบเบฑเบกเบเบญเบเบเบงเบเปเบเบปเบฒเปเบกเปเบเบกเบตเบขเบนเป.
เบเบตเปเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบเบปเบงเบเปเบฒเบเปเบญเบเบเปเบญเบ เปเบเบดเปเบเปเบเบเบฅเบฐเบซเบฑเบเบเบฒเบเบเบญเบเปเบเปเบเบตเปเบเบทเบเบเปเบญเบ.
เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบกเบต backends เปเบฅเบตเปเบกเบเบปเปเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ
เปเบเบทเปเบญเปเบซเปเปเบเปเปเบเบงเปเบฒเบเบฒเบเปเบเปเปเบเบเปเปเปเบกเปเบเบเบปเปเบงเปเบฅเบเบชเปเบฒเบฅเบฑเบเบเบธเปเบกเบเบฑเบเบซเบกเบปเบ, เปเบเปเปเบเปเบเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบชเบฐเปเบเบฒเบฐ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบงเบเปเบเบดเปเบเบชเบฐเบเบฑเบ Ingress. เบเปเบฒเบกเบฑเบเบเบปเบเบเบฑเบ 0.23 เบซเบผเบทเบชเบนเบเบเบงเปเบฒ, เปเบเปเบเปเบฒเบเบฑเบเบเบฒเบ Ingress เบเบทเปเบเปเบกเบทเบญเบ:
- เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบ override
default-backend
เบเบฒเบ เปเบเปเบฅเบฐเบเบปเบ Ingress เบเบญเบเบเบฒเบโเบเปเบฒโเปเบเปโเบเปเบฒโเบญเบฐโเบเบดโเบเบฒเบโ ; - เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบ override
custom-http-errors
เบเบฒเบ เปเบเปเบฅเบฐเบเบปเบ Ingress เบเบญเบเบเบฒเบโเบเปเบฒโเปเบเปโเบเปเบฒโเบญเบฐโเบเบดโเบเบฒเบโ .
เบเบฑเปเบเบเบฑเปเบ, เบเบฑเบเบเบฐเบเบฒเบเบญเบ Ingress เบเบฐเบกเบตเบฅเบฑเบเบชเบฐเบเบฐเปเบเบฑเปเบเบเบตเป:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Chart.Name }}-app2
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/custom-http-errors: "404,502"
nginx.ingress.kubernetes.io/default-backend: error-pages
spec:
tls:
- hosts:
- app2.example.com
secretName: wildcard-tls
rules:
- host: app2.example.com
http:
paths:
- path: /
backend:
serviceName: {{ .Chart.Name }}-app2
servicePort: 80
เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเปเปเบเบดเบเบเบฒเบ 404 เปเบฅเบฐ 502 เบเบฐเบเบทเบเปเบญเบเปเบเบซเบฒเบเปเบฅเบดเบเบฒเบเบซเบเปเบฒเบเปเปเบเบดเบเบเบฒเบเบเบตเปเบกเบตเบชเปเบงเบเบซเบปเบงเบเบตเปเบเปเบฒเปเบเบฑเบเบเบฑเบเบซเบกเบปเบ.
ะ เบฅเบธเปเบเบเปเบญเบเปเปเบฒเบเบญเบ Ingress เบเปเปเบกเบตเบเบธเบเบชเบปเบกเบเบฑเบเบเบตเป (
Ingress < 0.23: เปเบเบปเปเบฒเบซเบฒเปเบถเปเบ
เบเบฒเบเปเบฅเบทเบญเบเบเบตเปเปเบกเปเบเบเปเบฒเบเบเบฒเบเบเบงเปเบฒ. เปเบเบเบฒเบเบฐเปเบเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบตเปเปเบซเปเบเปเบฅเบดเบเบฒเบเบซเบเปเบฒเบเบญเบเบกเบฑเบ, เบเบงเบเปเบฎเบปเบฒเบกเบต HTML เบเบปเบเบเบฐเบเบด, เปเบเบดเปเบเบเปเปเบฎเบนเปเบงเบดเบเบตเบเบฒเบเปเบเบดเปเบเบซเบปเบงเบเปเปเปเบฅเบฐเบชเบปเปเบเบเบทเบเบฅเบฐเบซเบฑเบเบเบญเบเบชเบฐเบซเบเบญเบเบเบตเปเบเบทเบเบเปเบญเบ. เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบฑเปเบเบเปเบฒเบงเบเบทเบเบกเปเบงเบเบญเบญเบเบเปเบงเบ Ingress เบเบฒเบ url /error-pages
, เปเบฅเบฐเปเบเบฅเบฒเบเบเบฒเบ ws
เบเบฐเปเบเบฑเบ HTML เบเบตเปเบชเบปเปเบเบเบทเบ.
เบฎเบนเบเบเบฐเบเบญเบเปเบ YAML:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Chart.Name }}-app2
annotations:
kubernetes.io/ingress.class: "nginx"
ingress.kubernetes.io/server-snippet: |
proxy_intercept_errors on;
error_page 500 501 502 503 504 @error_pages;
location @error_pages {
rewrite ^ /error-pages/other/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
spec:
tls:
- hosts:
- app2.example.com
secretName: wildcard-tls
rules:
- host: app2.example.com
http:
paths:
- path: /
backend:
serviceName: {{ .Chart.Name }}-app2
servicePort: 80
เบเบฒเบเบเปเบฅเบดเบเบฒเบเบชเบณเบฅเบฑเบเบเบฒเบเบเบณเปเบเปเบเบตเปเบเปเบญเบเปเบเบฑเบเบเบฐเปเบเบ ClusterIP.
เปเบเบเบฐเบเบฐเบเบฝเบงเบเบฑเบ, เปเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฐเบกเบงเบเบเบปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ, เปเบ Ingress เบเบงเบเปเบฎเบปเบฒเปเบเบตเปเบก server-snippet เบซเบผเบท configuration-snippet เบเบตเปเบกเบตเปเบเบทเปเบญเบซเบฒเบเปเปเปเบเบเบตเป:
nginx.ingress.kubernetes.io /server-snippet: |
proxy_intercept_errors on;
error_page 500 501 502 503 504 @error_pages;
location @error_pages {
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
Ingress < 0.23: เบงเบดเบเบตเบเบตเบชเบญเบ
เบเบฒเบโเปเบฅเบทเบญเบโเบชเปเบฒโเบฅเบฑเบโเบเปเบฒโเบฎเปเบญเบโเบชเบฐโเบซเบกเบฑเบโเบเบตเปโเบชเบฒโเบกเบฒเบโเบเบฐโเบกเบงเบโเบเบปเบ headers ... เปเบฅเบฐโเปเบเบโเบเบปเปเบงโเปเบโเบเบตเปโเปเบกเปเบโเปเบเบฑเบโเบงเบดโเบเบตโเบเบตเปโเบเบทเบโเบเปเบญเบโเบซเบผเบฒเบโ, เบขเบทเบกโเบเบฒเบ custom-http-errorsโ. เบเบฒเบเบเปเบฒเปเบเปเบกเบฑเบเบเปเบงเบเบเบปเบเปเบญเบ (เบเบฒเบเบเบฑเบเบฅเบญเบ) เบเบฐเบเปเบงเบเปเบซเปเบเปเบฒเบเบเปเปเบเปเบฝเบเปเบเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบปเปเบงเปเบฅเบ.
เบเบฑเปเบโเบเบญเบโเบเบฑเปเบโเบเปเปโเปเบโเบเบตเปโ. เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบ
nginx.ingress.kubernetes.io /server-snippet: |
proxy_intercept_errors off;
error_page 404 = @custom_404;
error_page 503 = @custom_503;
location @custom_404 {
internal;
proxy_intercept_errors off;
proxy_set_header X-Code 404;
proxy_set_header X-Format $http_accept;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Namespace $namespace;
proxy_set_header X-Ingress-Name $ingress_name;
proxy_set_header X-Service-Name $service_name;
proxy_set_header X-Service-Port $service_port;
proxy_set_header Host $best_http_host;
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
location @custom_503 {
internal;
proxy_intercept_errors off;
proxy_set_header X-Code 503;
proxy_set_header X-Format $http_accept;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Namespace $namespace;
proxy_set_header X-Ingress-Name $ingress_name;
proxy_set_header X-Service-Name $service_name;
proxy_set_header X-Service-Port $service_port;
proxy_set_header Host $best_http_host;
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
เบเบฑเปเบเบเบตเปเปเบเบปเปเบฒเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเป, เบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบเปเปเบเบดเบเบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบเบชเบฐเบเบฒเบเบเบตเปเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบญเบ, เบเปเบญเบเบเบตเปเบชเปเบงเบเบซเบปเบงเบเบตเปเบเปเบฒเปเบเบฑเบเบเบฑเบเบซเบกเบปเบเบเบฐเบเบทเบเปเบชเป, เบเบทเบเบฑเบ "native" เบซเบเบถเปเบ.
PS
เบญเบทเปเบเปเบเบฒเบเบเบธเบเปเบเบฑเบเบฅเบฑเบ เปเบฅเบฐเปเบเบฑเบเบฅเบฑเบเบเบญเบ K8s:
- ยซ
เบเบฒเบเปเบญเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบเบเบธเปเบกเปเบเบซเบฒเบเบฒเบเบเบฑเบเบเบฒเบ Helm 2 " - ยซ
เบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบฑเบเบชเบฑเบ node เปเบฅเบฐเบเบฒเบเปเบซเบผเบเปเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเปเบงเบฑเบ " - ยซ
เบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบงเบฑเบเปเบเบเป dev " - ยซ
เปเบฅเบฑเปเบ bootstrap เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเปเบกเบนเบเบเบฐเบซเบเบฒเบเปเบซเบเป ".
เบญเปเบฒเบเบเบฑเบเบขเบนเปเปเบ blog เบเบญเบเบเบงเบเปเบฎเบปเบฒ:
- ยซ
เบเบฑเบเปเบเบซเบฒเบเปเบฅเบดเบเบฒเบเบเบธเบฅเบฐเบเบฒเบเบเบฑเบ Istio. เบเบฒเบเบเบต 1 " - ยซ
[เบฎเบนเบเปเบเปเบก] เบเบนเปเบกเบทเบเปเบฝเบงเบเบฑเบเปเบเบทเบญเบเปเบฒเบเปเบ Kubernetes. เบเบฒเบเบเบต 3 ".
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com