์์คํ ์ ๋ณด :
์ฌํ ๋จ๊ณ :
asciinema upload asciicast.json
์์๋๋ ๋์ :
asciinema.org์ ์ ๋ก๋ ๋ ํ์ผ
์ค์ ํ๋ :
ํด๋ผ์ด์ธํธ ์ธ์ ์ค๋ฅ ๋ฉ์์ง :
Error: Invalid request: <html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
์ถ๊ฐ ์ ๋ณด:
zsh (์ ๊ฒฝ์ฐ์๋ 4.3.11 (x86_64-redhat-linux-gnu)
)๋ฅผ ์ฌ์ฉํ๊ณ oh-my-zsh๋ฅผ ์ค์นํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ๊นจ์ง ๋
น์์ ๋ง๋ญ๋๋ค. oh-my-zsh๊ฐ ๋นํ์ฑํ๋๊ฑฐ๋ bash๊ฐ ์
ธ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ๋ฌธ์ ์์ด ๋
น์์ ๋ง๋ค๊ณ ์
๋ก๋ํฉ๋๋ค.
JSON ๊ธฐ๋ก : https://gist.github.com/andyone/b2a883e8c3795a6ad393a715ff7a41df
๋์๊ฒ๋ ์ผ์ด๋๋ค. ZSH๋ฅผ ์ฌ์ฉํ์ง๋ง OMZ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
$ zsh --version
zsh 5.3.1 (x86_64-pc-linux-gnu)
$ asciinema --version
asciinema 1.4.0
API URL์ HTTPS์์ HTTP๋ก ๋ณ๊ฒฝํ๋ฉด ๋ชจ๋ ์ ๋๋ก ์๋ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์ด์ ๋ก๋ ๋ฐธ๋ฐ์ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ Centos 7 Vagrant VM์์ ์ฌํ ํ ์์์์ต๋๋ค. ์ด์ ๋ถํฐ ์ฌ์ฉํ๋ Brightbox๋ก๋ ๋ฐธ๋ฐ์ (SSL ์ข ๋ฃ, ์๋ Let 's Encrypt ์ธ์ฆ์ ํฌํจ)์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@andyone @ThiefMaster ์ง๊ธ ์๋ํด ๋ณผ ์ ์์ต๋๊น? ๋ด๊ฐ ํด๊ฒฐํ์ ์๋ ์์ต๋๋ค.
์ฌ์ ํ 400 ์
OpenSSL ๊ด๋ จ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. curl์ SSL / TLS ์์ ์ ์ํด NSS (Network Security Services)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ curl์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
Brightbox๋ก๋ ๋ฐธ๋ฐ์ ์ฌ์ฉ
nginx ๊ธฐ๋ฐ ์๋ฃจ์ ์ ๋๊น?
@andyone Brightbox๋ก๋ ๋ฐธ๋ฐ์๊ฐ Haproxy๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ผ๊ด๋๊ฒ ์ฌํ ํ ์์๋ค. Vagrantfile ๋ฐ ์ง์นจ์ ๋ง๋ค์์ต๋๋ค. https://github.com/sickill/bb-lb-400
@andyone ๋ฌธ์ ๋ ๋ น์ ์์์ด ํน์ ์ค์ด ์๋ ์ ๋ก๋ ๋ json ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ์ ๋๋ค.
์ด ๊ตฌ์ฑ ์ผ๋ก webkaos๋ฅผ ๊ธฐ๋ฐ์ผ๋ก https://ascii.kaos.io ํ๋ก์๋ฅผ ๋ง๋ค์์ต๋๋ค ( BoringSSL๋ก ํฅ์๋ nginx). My ๋ฐ @ThiefMaster ๋ น์์ด์ด ํ๋ก์๋ฅผ ํตํด ์ฑ๊ณต์ ์ผ๋ก ์ ๋ก๋๋์์ต๋๋ค.
์ง๊ธ๊น์ง ๋ด๊ฐ ์๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
HTTP ์์ฒญ์ Brightbox ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ํตํด ์ ์งํ๋์ง๋ง HTTPS ์์ฒญ์ 400 ๊ฐ์ ์๋ชป๋ ์์ฒญ์ ์ ๊ณตํฉ๋๋ค.
์์ฒญ ๋ณธ๋ฌธ ์ด ์ฝ 4KB๋ณด๋ค ํฐ ์์ฒญ์ ๊ฒฝ์ฐ.
ํฅ๋ฏธ๋ก์ด ๊ฒ์ CentOS์์ HTTPS ์ฉ์ผ๋ก 400 ๊ฐ๋ฅผ ๋ฐ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. macOS์์ HTTPS๊ฐ ์ ๋๋ก ์๋ํฉ๋๋ค. (HTTP๋ ๋ชจ๋ ๊ณณ์์ ์ ์๋ํฉ๋๋ค).
๋๋ ๋ ๊น์ด ๋ค์ฌ๋ค ๋ณด๋ฉฐ ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์์ ๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๋๋ tcpdump๋ฅผ ์ฌ์ฉํ์ฌ CentOS์ macOS ๋ชจ๋์์ ์์ฒญ์ ํ์ธํ์ต๋๋ค (HTTP, ์์ฒญ ์์ฒด๊ฐ HTTPS์์์ ๋์ผํ ํ์์ด๋ผ๊ณ ๊ฐ์ ).
์ ์ผํ ์ฐจ์ด์ ์ macOS์์๋ ๋ณธ๋ฌธ ์์ 2 ๊ฐ์ ๋น ์ค, CentOS์์๋ 1 ๊ฐ์ ๋น ์ค์ ๋๋ค (์๋ง๋ ์ด๋ฌํ OS์์ Python 3๊ณผ ํจ๊ป ์ ๊ณต๋๋ urllib ๋ฒ์ ์ด ์ฝ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ผ ์ ์์).
CentOS :
POST /api/asciicasts HTTP/1.1
Accept-Encoding: identity
User-Agent: asciinema/1.4.0 CPython/3.4.5 Linux/3.10.0-514.16.1.el7.x86_64-x86_64-with-centos-7.3.1611-Core
Authorization: Basic <61 bytes of base64 encoded credentials>
Content-Length: 13582
Content-Type: multipart/form-data; boundary=c3f4e35afa4a4ce6b65b6420da09b46e
Connection: close
Host: asciinema.org
--c3f4e35afa4a4ce6b65b6420da09b46e
Content-Disposition: form-data; name="asciicast"; filename="asciicast.json"
Content-Type: application/json
<about 13 kb of json>
๋งฅ OS:
POST /api/asciicasts HTTP/1.1
Accept-Encoding: identity
Content-Length: 13582
Host: asciinema.org
User-Agent: asciinema/1.4.0 CPython/3.6.1 Darwin/16.5.0-x86_64-i386-64bit
Content-Type: multipart/form-data; boundary=71d5b757e9d1451b9540dc286f74207d
Authorization: Basic <61 bytes of base64 encoded credentials>
Connection: close
--71d5b757e9d1451b9540dc286f74207d
Content-Disposition: form-data; name="asciicast"; filename="asciicast.json"
Content-Type: application/json
<about 13 kb of json>
๊ทธ๊ฒ์ด ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง๋ณด๊ธฐ ์ํด LB์ "์์ฒญ ๋ฒํผ ํฌ๊ธฐ"๋ฅผ 4096 (๊ธฐ๋ณธ๊ฐ)์์ 8192 (์ต๋)๋ก ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ๊ฐ์๊ธฐ ๋ชจ๋ OS (๋ชจ๋ OS, HTTPS)์์ ์ ์์ ์ผ๋ก ์๋ํ๊ธฐ ์์ํ์ต๋๋ค.
๋ฒํผ ํฌ๊ธฐ๊ฐ 4096์ด๋ฉด ์ด๊ฒ์ด ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๊ถ๊ทน์ ์ธ ์๋ฃจ์ ์ด๋ผ๊ณ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
"์์ฒญ ๋ฒํผ ํฌ๊ธฐ"๋ฅผ 8192๋ก ๋๋ฆฌ๋ฉด ๋ณธ๋ฌธ ํฌ๊ธฐ์ ํ๋กํ ์ฝ์ด
์ค์ํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค. ๋ถ๋ชํ์
8192๋ก ์๊ฐ์ ๋ฒ๊ฑฐ๋ (์ํฅ๋ฐ๋ ์ฌ๋์ ์ค์ด์ญ์์ค)
๋ฌธ์ ๋ฅผ ์์ ํ ํด๊ฒฐํฉ๋๋ค (๊ทธ๋ ๋ค๋ฉด ์?).
์ด์ ๋ํด Brightbox์ ์ฐ๋ฝํ์ฌ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ค๋ช ํด ์ค ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Brightbox ์ธก์์ 8192 ๋ฒํผ ํฌ๊ธฐ๋ฅผ ๋ค์ ์ ๋ฐ์ดํธํ์ญ์์ค.์ด ๋ฒํธ๋ฅผ ์ฌ์ฉํ๋ฉด CentOS์์ ์๋ํ์ง๋ง @ThiefMaster ์์๋ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค.
Brightbox LB๋ฅผ ํตํด ํธ๋ํฝ์ ๋ณด๋ด๊ธฐ ์ ์ Nginx์์ SSL์ ์ข ๋ฃํ๊ณ ๋ชจ๋ ๊ฒ์ด ์๋ ๋์ ์ ์๋ํ์ต๋๋ค. Nginx๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ @andyone ์ ํ๋ก์์ ํจ๊ป ์๋ํ๋ ๊ฒฝ์ฐ Nginx๊ฐ ์์ฒญ ํ์์ ๋ํด ๋ "์ฉ์"ํ๋ ๋ฐ๋ฉด Haproxy๋ ๋ ์๊ฒฉํ๋ฉฐ asciinema ํด๋ผ์ด์ธํธ๋ Python 3.4 (๋ฐ ํด๋น Mac์์ ์ฌ์ฉํ๋ 3.6.1๋ณด๋ค ์ค๋๋ urllib).
๋์ค์ Haproxy๋ก ํ์ธํ ์ ์์ง๋ง ๋ด ๋ฒ์ ์ OpenSSL ๋์ LibreSSL๋ก ๋น๋๋์์ต๋๋ค.
๋ด ํ์ฌ ์ด๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํค๋ ๋ฐ ๋ณธ๋ฌธ ์์์ด ๋จ์ผ ์ ํ์ LB๊ฐ ํค๋ ์ฝ๊ธฐ๋ฅผ ์๋ฃํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ผ๋ฉฐ (์ ํ 2 ๊ฐ ์์), ๊ทธ ์๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํค๋๋ก ๊ณ์ ์ฝ๊ณ ๋ฐ์ดํธ๋ฅผ ๊ณ์ฐํ๋ฉฐ ๊ฒฐ๊ตญ ํค๋์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํฉ๋๋ค. LB์ bytes_read
(์์ผ์์ ์ฝ์ ๋ฐ์ดํธ)์ ๊ฐ์ ๋ณ์๊ฐ ์์ผ๋ฉด ํค๋ ์ฝ๊ธฐ๋ฅผ ๋ง์น ํ ๊ฐ์ ํ์ธํ ๋ค์ ๋ณธ๋ฌธ์ ์ฝ์ ํ ๋ค์ ๋ค์ ํ์ธํฉ๋๋ค. <4kb ํ์ผ์ ์
๋ก๋ํ๋ฉด ํค๋์ ๋ํ 4kb ์ ํ์ ์ด๊ณผํ์ง ์์ผ๋ฉฐ> 4kb๋ฅผ ์
๋ก๋ํ๋ฉด ์ด๊ณผํฉ๋๋ค.
(๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ HTTPS์์๋ง ๋ฐ์ํฉ๋๋ค)
๊ทธ๊ฒ ์ฌ์ค์ธ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๋ฆฌ๋ด์ด ์๊ฐ ๋ง ํด์ ๐
์์ค ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ ์ค์ ์ถ๊ฐํ๊ณ CentOS์์ ํ์ธํ์ง๋ง ์ฌ์ ํ ์คํจํฉ๋๋ค. ๋ฐ๋ผ์ ์์ ์ด๋ก ์ ์๋ชป๋์์ต๋๋ค.
์ด๊ฒ์ HTTPS๋ฅผ ์ฌ์ฉํ๋ CentOS์์ ์๋ํฉ๋๋ค.
curl -v -X POST -u $USER:api-token https://asciinema.org/api/asciicasts -F [email protected]
* About to connect() to asciinema.org port 443 (#0)
* Trying 109.107.38.233...
* Connected to asciinema.org (109.107.38.233) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=asciinema.org
* start date: Jun 07 09:12:00 2017 GMT
* expire date: Sep 05 09:12:00 2017 GMT
* common name: asciinema.org
* issuer: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
* Server auth using Basic with user 'vagrant'
> POST /api/asciicasts HTTP/1.1
> Authorization: Basic <...hidden...>
> User-Agent: curl/7.29.0
> Host: asciinema.org
> Accept: */*
> Content-Length: 5658
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------6ca3f3de6469
๊ทธ๋ ๋ค๋ฉด Python์์ ์ฌ์ฉํ๋ SSL lib๊ฐ curl๊ณผ ๋ค๋ฅด๊ณ ๋ฌธ์ ๊ฐ SSL ์์ญ ์ด๋๊ฐ์ ์์ต๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํด. Python์ OpenSSL์ ์ฌ์ฉํ๊ณ curl์ NSS๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@andyone ascii.kaos.io ์ ์ธ์ฆ์๋ Let 's Encrypt๊ฐ ์๋๋๋ค.
RapidSSL SHA256withRSA
์ผ๋ฐ์ ์ผ๋ก CentOS์ Let 's Encrypt (๋๋ ์ด์ ์ ์ฌํ ๐)์ ๋ํ ๋ฃจํธ ์ธ์ฆ์๊ฐ ๋๋ฝ๋์ด ์์ง๋ง SSL ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ง๊ณ ์ค๋ฅ๊ฐ HTTP ํ๋กํ ์ฝ ์์ค (400 Bad Request)์ ์์ผ๋ฏ๋ก ... ๐
Let 's Encrypt์ ๋ฃจํธ ์ธ์ฆ์๊ฐ ์์ผ๋ฉด curl์์๋ ์๋ํ์ง ์์ต๋๋ค.
(Brightbox)๋ก๋ ๋ฐธ๋ฐ์๋ ์ค์ ๋ก haproxy๋ฅผ ์ฌ์ฉํฉ๋๋ค. HTTP RFC ๋ฐ haproxy ๋ฌธ์๋ ํค๋๋ฅผ ๋ณธ๋ฌธ์์ ๋ถ๋ฆฌํ๋ ๋ฐ ํ๋์ CRLF๊ฐ ํ์ํ๋ค๊ณ ๋ช ์ํฉ๋๋ค.
https://github.com/haproxy/haproxy/blob/master/doc/internals/http-parsing.txt
์ฌ๊ธฐ์์ ์ ์ฒด CRLF๊ฐ ์๋ CR ๋๋ LF ๋ง ๋ณด๋ผ ์ ์์ต๋๊น?
@sickill ์ด๊ฒ์ LibreSSL 2.5.0- https: //ascii-ha.kaos.io๋ฅผ ์ฌ์ฉ ํ๋ HA-Proxy 1.7.5์ ํ๋ก์ ์
๋๋ค. My ๋ฐ @ThiefMaster ๋
น์๊ณผ ์ ์ฅ์์ over-4k.json
์ด์ด ํ๋ก์๋ฅผ ํตํด ์ฑ๊ณต์ ์ผ๋ก ์
๋ก๋๋์์ต๋๋ค.
@andyone ์ข์์. ๊ทธ๋ ๋ค๋ฉด tune.bufsize
(https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#3.2-tune.bufsize)๋ฅผ 4096์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๊น?
@johnl CRLF๋ฅผ ํ์ธํ๊ณ ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ด์ฐฎ์ต๋๋ค.
๋ค์ CentOS์ macOS ๋ชจ๋์์ ์์ฒญ์ tcpdumpedํ์ต๋๋ค (HTTP ํ์ด๋ก๋๊ฐ HTTPS์ ๋ํด ๋์ผํ๋ค๊ณ ๊ฐ์ ํ๊ณ HTTP๋ฅผ ํตํด).
dump-centos.pcap.txt ๋ฐ dump-mac.pcap.txt์๋ tcpdump ์บก์ฒ ( tcpdump -s 0 dst port 80 -w dump-centos.pcap.txt
)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
dump-centos-hex.txt ๋ฐ dump-mac-hex.txt์๋ 16 ์ง ํ์์ ๋คํ๊ฐ ํฌํจ๋ฉ๋๋ค ( hexdump -C
).
dump-centos-hex.txt
dump-centos.pcap.txt
dump-mac-hex.txt
dump-mac.pcap.txt
๋ OS ๋ชจ๋์์ ์ ์ค์ ์ฌ์ฉ๋๋ CRLF๊ฐ ์๊ณ ํค๋์ ๋ณธ๋ฌธ ์ฌ์ด์ ํ๋์ ๋น ์ค์ด ์์ต๋๋ค.
์ผ์ชฝ CentOS, ์ค๋ฅธ์ชฝ macOS :
@sickill ๊ตฌ์ฑ์ด ์
๋ฐ์ดํธ๋์์ต๋๋ค. over-4k.json
์
๋ก๋๋์์ต๋๋ค.
@andyone ์
๋ฐ์ดํธ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. X-Forwarded-Proto
ํค๋๋ฅผ ์ถ๊ฐํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค (๋ฐํ ๋ ๋
นํ URL์ด http://
์ด๋ฏ๋ก). http-request set-header X-Forwarded-Proto https if { ssl_fc }
๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๊น?
์ด๊ฒ์ ๋ด ๊ตฌ์ฑ์ ๋๋ค.
frontend www-https
bind 207.154.241.251:443 ssl crt /etc/ssl/private/kaos.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
backend www-backend
server asciinema-backend asciinema.org:80
์ด ์ค์ ์ด๋์ ์ถ๊ฐํด์ผํฉ๋๊น?
@andyone backend
์น์
์ผ๋ก ์ด๋ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค (๋๋ haproxy ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค).
@andyone btw, ๋๋ฒ๊ทธ๋ฅผ ๋์ ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค ๐ ๊ฐ์ฌํฉ๋๋ค!
์์ผ๋ก๋ ์์ง ๋ง์ธ์. ์ด๊ฒ์ SSL ์ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๋ณต์ ํด์ผํฉ๋๋ค.
tune.bufsize 4096
tune.ssl.default-dh-param 2048
tune.maxrewrite 40
frontend www-https
bind 207.154.241.251:443 ssl no-sslv3 crt /etc/ssl/private/kaos.pem ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
backend www-backend
server asciinema-backend asciinema.org:80
mode http
option forwardfor
option httplog
๋๋ ์ด๊ฒ์ผ๋ก ๊ตฌ์ฑ์ ์์ ํ์ง๋ง ์ด์ด ์๋ค.
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend www-https
bind 207.154.241.251:443 ssl crt /etc/ssl/private/kaos.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
backend www-backend
http-request set-header X-Forwarded-Proto https
server asciinema-backend asciinema.org:80
ํด๋ผ์ด์ธํธ๋ ์ฌ์ ํ http://
๋งํฌ๋ฅผ ๋ฐํํฉ๋๋ค.
์ ์ฉํ ์๋น์ค๋ฅผ ๊ฐ์ ํ ์ ์๋๋ก ํญ์ ๊ธฐ๊บผ์ด ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค ๐.
@johnl ์ด๊ฒ์ ์ ์ฒด ๊ตฌ์ฑ์ด๋ฉฐ ๋ชจ๋ ํ์ ์ต์
์ defaults
๋ฐ global
์น์
์์ ์ค์ ๋ฉ๋๋ค.
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
tune.bufsize 4096
# SSL configuration
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-default-server-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend www-https
bind 207.154.241.251:443 ssl crt /etc/ssl/private/kaos.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
backend www-backend
http-request set-header X-Forwarded-Proto https
server asciinema-backend asciinema.org:80
@andyone ์ haproxy ๊ตฌ์ฑ์ด ์ด์ BB์ ๋งค์ฐ ๊ฐ๊น๊ณ ์ฌ์ ํ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์์๋ ๊ฒฝ์ฐ https://ascii-ha.kaos.io ์ https://asciinema.org ์ ์ฐจ์ด์ ์ค ํ๋์ ๋๋ค
์ด๊ฒ์ https://ascii-ha.kaos.io ์ https://asciinema.org ์ ์ฐจ์ด์ ์ค ํ๋์ ๋๋ค
์๋์. BB LB๋ OpenSSL๋ก ๊ตฌ์ถ ํ ์ ์์ต๋๋ค (์ ๋ LibreSSL์ ์ฌ์ฉํฉ๋๋ค).
https://ascii-ha.kaos.io์ Let 's Encrypt ์ธ์ฆ์๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค
์๋ฃ-https: //ascii.kaos.re
HA-Proxy 1.7.5 (LibreSSL 2.5.0 ํฌํจ) + Let 's Encrypt ์ธ์ฆ์ (Certbot์์ ์์ฑ)
๊ตฌ์ฑ :
tune.bufsize 4096
tune.ssl.default-dh-param 2048
tune.maxrewrite 40
frontend www-https
bind 207.154.241.251:443 ssl no-sslv3 crt /etc/ssl/private/ascii.kaos.re.pem ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
backend www-backend
server asciinema-backend asciinema.org:80
mode http
option forwardfor
option httplog
๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. over-4k.json
์
๋ก๋๋์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ํ ๋ ์ด์์ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐ SSL ์ข ๋ฃ๋ฅผ ์ํด ์์ฒด Nginx ์ธ์คํด์ค๋ก ๋กค๋ฐฑํ๋ ๊ฒ์ ๊ณ ๋ ค ์ค์ ๋๋ค ๐ค
๋ฌธ์ ๋ฅผ ์ฌํ ํ ์์๋ ๋จ์ผ curl ๋ช ๋ น์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ง๋ง ์์ง ๊ด๋ฆฌํ์ง ์์์ต๋๋ค. ๋๊ตฌ๋ ์ง ๋์ธ ์ ์์ต๋๊น?
curl์ ์ฌ์ฉํ์ฌ ์ธ์ฆ ์ฌ์ฉ์ ์ด๋ฆ / ๋น๋ฐ๋ฒํธ๋ก 5k ๋ณธ๋ฌธ์ ๊ฒ์ํ๊ณ ์์ต๋๋ค. netcat ์น ์๋ฒ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ์ฌ Brightbox๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์์ฒญ ํ ์คํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํญ์ ํต๊ณผ-์๋ชป๋ ์์ฒญ ์๋ต์ ํธ๋ฆฌ๊ฑฐ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด๋ก๋ ๋ฐธ๋ฐ์์ ์ํด ๊ฑฐ๋ถ๋๋ ๊ฒฝ์ฐ ๋ฐฑ์๋์ ์ฑ์ ์ค์ ์ธ์คํด์ค๊ฐ ํ์ํ์ง ์์์ผํฉ๋๋ค. ๊ทธ๋ ๊ฒ ๋ฉ์ด์ง์ง ์์์ผํ๋ฏ๋ก ์ฑ์์ด curl๋ก์ด๋ฅผ ์ฌํ ํ ์ ์์ด์ผํฉ๋๋ค.
๋๋ ์ฐ๋ถํฌ์ centos7์์ ๊ทธ๋ฆฌ๊ณ ํน๋ณํ openssl์ ์ฌ์ฉํ์ฌ curl์ ์๋ํ์ต๋๋ค (์ฌ์ฉํ sslib lib๋ฅผ ์ ํํ๊ธฐ ์ํด curl์ --engine ๋ช ๋ น์ ์ง์ ํ ์ ์์ต๋๋ค. centos7 curl ๋ฐ์ด๋๋ฆฌ๋ ๋๋ถ๋ถ์ ์ต์ ์ ๋ํด ๋น๋๋ฉ๋๋ค)
@johnl ์ด๊ฒ์ ์กฐ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
ํ ์คํธ ์ฉ ๋ฐฑ์๋๋ก netcat์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค ๐
asciinema upload over-4k.json
ํด๋นํ๋ curl์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
curl -v -X POST -u test:uuid4 https://asciinema.org/api/asciicasts -F [email protected]
( uuid4
๋ฅผ python3 -c 'import uuid; print(uuid.uuid4())'
์ ๊ฒฐ๊ณผ๋ก ๋์ฒด)
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ค์ ๋ก ์ปฌ๊ณผ ํจ๊ป ์๋ํฉ๋๋ค ...
asciinema upload
tcpdump์ ์์ curl์ ๋น๊ตํ๋๋ฐ HTTP ํ๋กํ ์ฝ ์์ค์์ ์์ฌ์ค๋ฌ์ด ๊ฒ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ tcp ํ๋ ์์ ๋ค๋ฅธ ์์น์ ํ์๋ฉ๋๋ค (๊ฐ tcp ํจํท์ ๋ ๋ง๊ฑฐ๋ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ก / ์ ํฉ ๋ ์ ์์).
CentOS 7 VM์์ tcpflow๋ก HTTP ์์ฒญ (http://asciinema.org๋ก)์ ์บก์ฒํ์ต๋๋ค.
sudo tcpflow -p -C -i eth0 port 80 >tcpflow-req.txt
๊ทธ๋ฐ ๋ค์ ๋์ผํ VM์ ๋ค๋ฅธ ์ ธ์์ ๋ค์์ ์คํํ์ต๋๋ค.
ASCIINEMA_API_URL=http://asciinema.org asciinema upload /vagrant/over-4k.json
์๋ต์ ๋๊ณ ์์ฒญ ๋ง ๋จ๊ฒผ์ต๋๋ค. ๋ค์์ ๋ฐ์ดํธ ๋จ์๋ก ์ ์ก๋๋ ๋ด์ฉ์ ๋๋ค. tcpflow-req.txt
์ด ์บก์ฒ ๋ HTTP ์์ฒญ์ asciinema์ ๋ํด ์ฌ์ํ์ต๋๋ค. org : 80 with nc
:
bash-4.4$ (cat tcpflow-req.txt; cat) | nc asciinema.org 80
HTTP/1.1 201 Created
Server: nginx
Date: Mon, 12 Jun 2017 13:30:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 48
Connection: close
Status: 201 Created
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Location: http://asciinema.org/a/4lgbbik7li4ywzqrfak0e7eku
ETag: "9beb7ac6bb5981f06fdc71df3947d8b0"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 2a8a8c75-ed06-4741-9adb-e5d276032ded
X-Runtime: 0.360858
Vary: Accept-Encoding
Strict-Transport-Security: max-age=15768000
http://asciinema.org/a/4lgbbik7li4ywzqrfak0e7eku
๋ฌธ์ ์๋ค.
์ด์ SSL์ ํตํด asciinema๋ก ๋ณด๋์ต๋๋ค. org : 443 :
(cat tcpflow-req.txt; cat) | openssl s_client -connect asciinema.org:443
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CONNECTED(00000003)
depth=1 /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/CN=asciinema.org
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFFDCCA/ygAwIBAgISBDhrp0YwV5NtleFOG+Zj61lQMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzA2MDcwOTEyMDBaFw0x
NzA5MDUwOTEyMDBaMBgxFjAUBgNVBAMTDWFzY2lpbmVtYS5vcmcwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+/g237mVels4G9blsZlaeeiURbSp22eGO
T5OZ5As9NyuxSvRVEJrs4xk/RBEkCVgeZspSOmkRLwXG+FSMtjhbqIUt73AUKMdm
4DG+OwkVxjZatskL0wUWRcU7DmyW/Ls/OFJpPPcZ+pqu/v/ek99EiVNoAHJzXMXJ
ZsWy5KLE3fhkrlyMvdIkOkCK5zHOT95t0i8OmdaPIekPBa57VhvnDlUJsYyCF9GN
mP8Qg6OygexyULJGqBwiZ0BN2J6cYwChUlSvqFnkL4OzfixZ+mItuhl1b1vx/N5K
XMtPiM+nc/S+/liIWgtt7HIy9NmrOtSKbPTh3Bv/rfNdaiYx5CUHAgMBAAGjggIk
MIICIDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNAMhQNNwl+/bJjml9hrrHYzBxbf
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wLwYDVR0RBCgwJoINYXNjaWluZW1hLm9yZ4IVc3RhZ2luZy5hc2NpaW5lbWEu
b3JnMIH+BgNVHSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAm
BggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUF
BwICMIGeDIGbVGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBv
biBieSBSZWx5aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRo
IHRoZSBDZXJ0aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5j
cnlwdC5vcmcvcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBABxmJxdQQCcy
FpCkiDrB+vonBUCLYSJtrFkmRdmj9W8/ADpC6M/EhYFOCgrO2cmhYfy1SxDAP5Hd
KIhd3p1F931MMXVcxYt2n6FiDJHN531qp6eBzjZsVIgHXS27PAV466IIMTydNQSe
reyDc9fi+q+ji1Gz89nI8lHIOlRt3dzVGT2J3oQidsm4ZuPNJFj4y8MUrbUAOOH6
YY4n395OKV7vWzl7VPKiCWx+zsv4bzr6IGUPlwqCN2e6cppPWE47ugnYsarINCHO
ie5lU4E2N0k2qVWe/+uYbwSUQ0nrEx8R078m6+6EjDkR4VLboLjuV5tGBgHsJLQB
CmLH6CmNCRE=
-----END CERTIFICATE-----
subject=/CN=asciinema.org
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
---
SSL handshake has read 3436 bytes and written 456 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : DHE-RSA-AES128-SHA
Session-ID: AC26CBF8D3719B1DE709A9A8AEAB43D20B14C62085A74604338C512CEA4472C5
Session-ID-ctx:
Master-Key: 0C59B1A2B6802D35FAD26DEE139043A853F3E62787E9AA743A8CAFDA95744DB73AB42B511F37EA7D6BB398A352938551
Key-Arg : None
Start Time: 1497273777
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
/ cc @johnl
@sickill https://ascii.kaos.re์์ ๋์ผํ ์์ฒญ์ ํ์ธํ ์ ์์ต๋๊น
@andyone์ด ๋ฐฉ๊ธ ํ์ธํ์ต๋๋ค. (cat tcpflow-req.txt; cat) | openssl s_client -connect ascii.kaos.re:443
์ฑ๊ณต์ ์ผ๋ก ์
๋ก๋๋์์ต๋๋ค.
๋๋ ์ฌ๊ธฐ์ ๋ ๋ง์ ๊ฒ์ ํํค ์ณค๋ค. centos7์ curl์ nss๋ฅผ ์ฌ์ฉํ์ง๋ง wget์ openssl์ ์ฌ์ฉํฉ๋๋ค. curl ๋๋ wget์ ์ฌ์ฉํ์ฌ ์ฑ๊ณต์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. python httpie ๋๊ตฌ (python 3 ์๋)๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
ํ์ง๋ง stdin์ ํตํด openssl s_client๋ก ๋ณด๋ด๋ ๋ฐ ์คํจํฉ๋๋ค.
๊ทธ๋ฌ๋ stdin์ ์ฌ์ฉํ๋ ๋์ ์์ฒญ์ ๋ถ์ฌ ๋ฃ์ด openssl s_client๋ก ์ ์กํ๋ ๋ฐ ์ฑ๊ณตํฉ๋๋ค!
๋๋ ์ด๊ฒ์ด ํ์ํ CRLF ๋ผ์ธ ์๋ฉ์ด ์๋ LF ๋ผ์ธ ์๋ฉ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ํ์คํ๋ค๊ณ ํ์ ํ์ง๋ง, ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ "openssl s_client"๊ฐ ๋์ ํ ์คํธ ๋๊ตฌ์ด๊ณ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์์ง nss ๋๋ openssl์ ์ฌ์ฉํ๋ ์ ์ ํ http ํด๋ผ์ด์ธํธ๋ก ์ด๊ฒ์ ์ฌํํ์ง ๋ชปํ์ต๋๋ค (์ฐ๋ถํฌ์ ์ปฌ๋ openssl์ ์ฌ์ฉํ๊ณ ์ ์๋ํ๋ฏ๋ก ๋ ๋ฒ ํ์ธํ์ต๋๋ค). ๋ค๋ฅธ ์ฌ๋์ด ๊ด๋ฆฌํฉ๋๊น?
๋ฐฉ๊ธ ๋ช ๊ฐ์ง ํ
์คํธ๋ฅผ ์ํํ์ผ๋ฉฐ์ด ๋ฌธ์ ๊ฐ ์ฝํ
์ธ ๊ธธ์ด 4520์ผ๋ก ์ง์๋์ง๋ง ๋์ผํ ์์ฒญ์ด 1000 ์ (๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ ์กฐ์ ๋ Content-Length
๊ฐ ์๋๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
CRLF๋ ๋ด ๋ชจ๋ ํ
์คํธ์ ์์ผ๋ฉฐ xxd
๋ ํ์ดํ๋ฅผ ํตํด ์ ์ก๋์์์ ํ์ธํฉ๋๋ค.
OpenBSD์ nc
(TLS ์ง์)์ผ๋ก ํ
์คํธ ํ ์๋ ์์ต๋๋ค.
tune.bufsize
๋ฒํผ ํฌ๊ธฐ๋ฅผ์ด ํฌ๊ธฐ (๋ฐ์ดํธ)๋ก ์ค์ ํฉ๋๋ค. ๋ฎ์ ๊ฐ์ ๋ ๋ง์ ๊ฒ์ ํ์ฉํฉ๋๋ค
์ธ์ ์ด ๊ฐ์ ์์ RAM์ ๊ณต์กดํ๊ณ ๊ฐ์ด ๋์์๋ก
๋งค์ฐ ํฐ ์ฟ ํค๊ฐ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 16384์ด๋ฉฐ
๋น๋์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค
๋งค์ฐ ๋ฎ์ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ถ ์๋น์ค๋ฅผ ์ค๋จํ๋ฏ๋ก ๊ธฐ๋ณธ๊ฐ์์
ํต๊ณ ๋ฐ ๊ธฐ๋ณธ ํฌ๊ธฐ๋ณด๋ค ํฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฆ๊ฐ์ํต๋๋ค.
์์คํ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ ์์ต๋๋ค. ์ต์ํ ๊ธ๋ก๋ฒ maxconn
๋งค๊ฐ ๋ณ์๋์ด ๊ฐ์ด ์ฆ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์์ธ์ผ๋ก ๊ฐ์๋์ด์ผํฉ๋๋ค.
HTTP ์์ฒญ์ด (tune.bufsize-tune.maxrewrite)๋ณด๋ค ํฌ๋ฉด haproxy๊ฐ
HTTP 400 (์๋ชป๋ ์์ฒญ) ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก HTTP ์๋ต์ด ๋ ํฐ ๊ฒฝ์ฐ
์ด ํฌ๊ธฐ๋ณด๋ค haproxy๋ HTTP 502 (์๋ชป๋ ๊ฒ์ดํธ์จ์ด)๋ฅผ ๋ฐํํฉ๋๋ค.
์ ์ฒด ์์ฒญ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ง ์๊ณ ์ฆ์ ์ ๋ฌ (AFAIK)ํ๊ฑฐ๋ ์ต์ํ ์์ ํ์ผ๋ก ๋ฒํผ๋งํ๋ nginx์๋ ๋ฌ๋ฆฌ.
์ด no option http-buffer-request
์ต์
, ์ด๋ ๋ด๊ฐ ํ๋์ด ์ ํํ ๊ทธ ๊ถ๋ฆฌ๋ฅผ ๋นํ์ฑํ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ (์์ฑ๋ option http-buffer-request
ํ์ง ์๊ณ , no
) :
๋๋๋ก HTTP ์์ฒญ์ ๋ณธ๋ฌธ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
๊ฒฐ์ ์ ๋ด๋ฆฝ๋๋ค. ์ด๊ฒ์ "balance url_param"์ ์ํด ์ํ๋๋ ์์ ์ ๋๋ค.
์. ์ฒซ ๋ฒ์งธ ์ฌ์ฉ ์ฌ๋ก๋ ์ด์ ์ ๋๋ฆฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฒํผ๋งํ๋ ๊ฒ์ ๋๋ค.
์๋ฒ์ ์ฐ๊ฒฐ. ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ผ์ฐํ ์ ์ทจํ๋ ๊ฒ์ ๋๋ค.
์์ฒญ ๋ณธ๋ฌธ์ ๋ด์ฉ์ ๋ฐ๋ผ ๊ฒฐ์ . ์ด ์ต์ ์
ํ๋ก ํธ ์๋ ๋๋ ๋ฐฑ์๋๋ HTTP ์ฒ๋ฆฌ๊ฐ ์ ์ฒด
๋ณธ๋ฌธ์ด ์์ ๋์๊ฑฐ๋ ์์ฒญ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐผ๊ฑฐ๋ ์ฒซ ๋ฒ์งธ ์ฒญํฌ๊ฐ
์ฒญํฌ ์ธ์ฝ๋ฉ์ ๊ฒฝ์ฐ ์๋ฃ๋ฉ๋๋ค. ์์น ์๋ ๋ถ์์ฉ์ด์์ ์ ์์ต๋๋ค.
HTTP๋ฅผ ๋จ์ฉํ๋ ์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์
ํ๋ฐํธ ์๋์ ๋ฐฑ์๋๊ฐ ์ฌ์ฉ๋๋ฏ๋ก
๊ธฐ๋ณธ.
๋๋ ์ณค์ด. HTTP๋ฅผ ํตํด ์๋ํ์ง๋ง HTTPS๊ฐ ์๋ ๋์ผํ ์ฝํ ์ธ ๋ฅผ ํ ์คํธํ๋ฉด ํด๋ผ์ด์ธํธ์ ํ๋ก์ ์ฌ์ด์ ๋ง์ ์ถ๊ฐ ํค๋๊ฐ ์ถ๊ฐ๋์ง ์๋ ํ ๋ฒํผ ํฌ๊ธฐ๊ฐ ์๋ชป ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
๊ทธ๋ฌ๋ SSL ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋ ๋ฒ๊ทธ๊ฐ ํค๋๋ฅผ ์ฝ๊ฐ ์์์ํฌ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด HAProxy์ ๋ณด์์ ๋ฎ์ถ์ง ๋ง ๋ ์ค์ํ๋ HTTP ํธ๋ํฝ์ ํ์ฉํ๋ ์ต์ ์ด ์์ต๋๋ค. https://stackoverflow.com/questions/39286346/extra-space-in-http-headers-gives-400-error-on-haproxy๋ฅผ ์ฐธ์กฐ
์ต์ข ์์ ์ผ๋ก ๋ณด์ ๊ฐ์๋ฅผ ์นํธํ์ง๋ ์์ง๋ง์ด๋ฅผ ํตํด ๋๋ฒ๊น ํ๋ ๋์ ์๋น์ค๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๋ค์ Haproxy์ ์ค์ ์ ์ ์ดํ์ง ์๋๋ก ์๊ฐ asciinema.org์์ @peterbrittain๋ Brightbox ํด๋ผ์ฐ๋ ๋ถํ ๋ถ์ฐ ์ฅ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ์ Nginx์์ SSL์ ์ข ๋ฃํ๋ ๋ฐ ์ฌ์ฉ๋์์ผ๋ฉฐ ์ ๋๋ก ์๋ํ์ต๋๋ค. BB LB๋ก ์ ํํ๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค (์ผ๋ถ). CentOS ๋๋ ๋ค๋ฅธ ์์คํ ์์ ๊ฒฝํํ๊ณ ์์ต๋๊น?
์์งํ, ์ด์ Nginx ๊ธฐ๋ฐ ์๋ฃจ์ ์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ SSL ์ธ์ฆ์๊ฐ ๋ง๋ฃ๋์ด Let 's Encrypt๋ก ๊ฐ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. LE ์ธ์ฆ์๋ ์๋ช ์ด ์งง๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ผ๋ฉฐ Brightbox LB๊ฐ์ด๋ฅผ ์ํํฉ๋๋ค. LE ์ค์ ์์ ์ ์ ์ฝํ๊ณ ์ถ์๊ณ BB LB๊ฐ ๊ฐ์ฅ ๊ฐ๋จํ ์๋ฃจ์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค (asciinema.org๋ Brightbox๊ฐ ํ์ํ๊ณ ํ๋ฅญํ ์ธํ๋ผ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค). ์ด์ Nginx์์ LE๋ฅผ ์ง์ ์ค์ ํ๋ฉด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ด๋ฏธ ์๋น ํ ์๊ฐ์ 1/10์ด ๊ฑธ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๐๐๐
์. ๋๋ ๋๊ฐ ์ด๋ค ๋นํธ๋ฅผ ์์ ํ๋์ง์ ๋ํ ๋ฏธ๋ฌํจ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด BB์์ ์ง๋จ์๋ฐ์ ์ ์ด ์์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋๋ต : ๋ด ์์๋ CentOS 6 VM์ ๋๋ค.
๋๋ ๋ํ asciinema 1.2.0 (์ฐ๋ถํฌ 16.04 lts์ ๋ฒ์ )์ ์ฌ์ฉํ์ฌ ์๋ชป๋ ์์ฒญ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค.
์์ ์ฃผ์ด์ง ์ปฌ ํดํน์ด ์๋ํ์ต๋๋ค.
๋ฐฉ๊ธ ๋์ผํ ํ์ผ์ด Gentoo [1] ์์์์ ์๋ชป๋ ์์ฒญ์ ์์ฑํ์ง๋ง OpenBSD [2] ์์์์๋ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ ๋ฐฉ๊ธ ๋ฐ๊ฒฌํ์ต๋๋ค.
OpenBSD๋ ์ ์
๋ก๋ํฉ๋๋ค.
์ด ํด๋ผ์ด์ธํธ๋ค ๊ฐ์ ์ฐจ์ด์ ์ ๋ํ ์ถ๊ฐ ์กฐ์ฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ํฌ ๋ฐ์ค๋์ด ๋น๋ ๋น ๋ค์๊ณผ ๊ฐ์ ํ์ด์ฌ ํ๊ฒ์ ์ง์ํฉ๋๋ค :
PYTHON_TARGETS="python3_4 -python3_5"
๋๋ ํ์ฌ python3.5๋ฅผ ์ฝ๊ฒ ํ ์คํธ ํ ์ ์์ง๋ง ์๋ง๋ ์ด๊ฒ์ ์ด๋ฏธ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
ํธ์ง : OpenSSL ๋ฒ์ ์ ์ถ๊ฐํ์ง๋ง ์์ ํ ์์ด ๋ฒ๋ ธ์ต๋๋ค.
OpenSSL 1.0.2l 2017 ๋ 5 ์ 25 ์ผ
asciinema 1.3.0
๋ฐฉ๊ธ ์ด์ ๊ตฌ์ฑ์ผ๋ก ๋ค์ ์ ํํ์ต๋๋ค (Nginx์์ SSL ์ข ๋ฃ). ์ง๊ธ ์๋ํ๋์ง ์๋ ค์ฃผ์ธ์ @andyone @ThiefMaster @benaryorg @peterbrittain @ThomasWaldmann
@sickill ๋๋ ๊ทธ๊ฒ์ด ์ด์ ์ ์คํจํ ๋์ผํ ํ์ผ์ด๋ผ๊ณ 85 % ํ์ ํ์ง๋ง ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด, ๋น์ ์ ๊ทธ๊ฒ์
@sickill ์ง๊ธ์ ๋งค๋ ฅ์ ์ผ๋ก ์๋ํฉ๋๋ค. ๐
๋ค, ( asciinema upload
) ๋์๊ฒ๋ ์๋ํฉ๋๋ค. ๊ฐ์ฌ!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฐฉ๊ธ ์ด์ ๊ตฌ์ฑ์ผ๋ก ๋ค์ ์ ํํ์ต๋๋ค (Nginx์์ SSL ์ข ๋ฃ). ์ง๊ธ ์๋ํ๋์ง ์๋ ค์ฃผ์ธ์ @andyone @ThiefMaster @benaryorg @peterbrittain @ThomasWaldmann