[x] Launch the installation of siege with homebrew
미리 설치가 필요하다.
brew install siege
brew install telnet
[x] Ask to get an explanation of how select is working.
select는 I/O동작에서 다중 file descriptor들이 준비 상태가 될때까지 모니터링할 수 있게 해주는 system call입니다.
select는 FD_SETSIZE 보다 적은 file descriptor 개수만 모니터링 할 수 있습니다. (mac 기준 1024)
[x] Ask if there is only one select and how they've managed the server accept and the client read/write.
vscode search로 select, read, write 검색.
[x] The select should be in the main loop and should check fd for read and write AT THE SAME TIME, if not please give a 0 and stop the evalaution.
select가 main loop에 존재해야하고, fd에서 읽기와 쓰기를 한번에 해야한다.
[x] There should be only one read or one write per client per select. ASK to show you the code that goes from the select th the read and write of a client.
[x] Search for all read/recv/write/send on a socket and check that if an error returned the client is removed.
모든 read/recv/write/send에 대하여 에러처리가 돼있는지 확인한다.
[x] Search for all read/recv/write/send and check if the returned value is well checked.(checking only -1 or 0 is not good you should check both)
read/recv/write/send에 대해 return 값 -1, 0 두개 모두 처리됐는지 확인해야한다.
[x] If a check of errno is done after read/recv/write/send. Please stop the evaluation and put a mark 0.
errono 쓰지 말자
[x] Writing or reading ANY file descriptor without going through the select is strictly FORBIDDEN.
config file 읽는건 괜찮겠져...?
select 이후(서버 실행 이후) 생성된 fd는 모두 select를 걸쳐야한다.
CGI 파이프도 걸쳐야한다..?
Configuration
[x] setup multiple servers with different port
[x] 이미 점유되고 있는 포트로 서버를 실행시키면 bind error가 발생한다.
[x] 만약 8080, 8081, 8082, 8080 이렇게 4 개의 서버가 config에 있다고 할 때 ServerGenerator은 차례로 ServerManager가 관리하는 std::vector<Server *> 에 넣는다. 그리고 이후에 이 서버들을 소켓 함수들을 이용해서 네트워크에 연결한다.
[x] 위의 예시대로 실행시키면 Server Manager는 throw를 던지고 서버는 곧장 종료된다.
[x] 여기서 문제가 발생함. 기존에 new Server를 통해 생성된 서버가 닫혀지지 않는다.
[x] 따라서 throw가 던져질 때 기존에 생성되어 있던 모든 서버들을 할당 해제하고 종료하게 만들자.
[ ] setup multiple servers with different host name (use something like curl --resolve ~~)
[ ] 예시로 나온 curl --resolve~는 클러스터에서는 적용되지 않고 개인의 맥에서 가능함.
[x] setup default error page (try to change the error 404)
config file 경로 바꾸기.
html 파일 직접 수정.
[x] limit the client body
location /post_body의 limit_client_body_size값을 10으로 변경
Success: curl -X POST localhost:8080/post_body -d "0123456789"
Fail: curl -X POST localhost:8080/post_body -d "012345678911"
[x] setup routes in a server to different directories
[x] config file에서 다른 폴더도 가능한것을 보여주자. (username 다른것)
[x] setup a list of method accepted for a certain route (ex: setup only HEAD on a route and use curl with and without option -X HEAD)
[x] In the configuration file setup multiple port and use different website, use a browser to check that the configuration is working as expected and show the right website.
여러 포트별로 다른 페이지를 보여줄 수 있어야합니다.
8080, 8081 접속 ㄱㄱ
[x] In the configuration try to setup same port multiple times. It should not work.
[x] 같은 포트 여러번 실행해보자. bind error 가 출력되면서 서버가 실행되지 않아야한다.
[x] Launch multiple server at the same time with different configuration but with common ports. Is it working? If it is working, ask why the server should work if one of the configuration isn't working. Keep going.
[x] config file에 동일한 포트 2개이상 설정해보자. bind error 가 출력되면서 실행되지 않아야한다.
Siege
[x] Use Siege to run some stress test.
siege http://localhost:8080 -b
[x] Check if there is no memory leak
[x] Check if there is no hanging connection
[x] lsof -p wevserv_process_id 를 터미널에 입력하고 CLOSED_WAIT 가 존재하면 hanging connection이 존재한다.
[x] You should be able to use siege indefinitly without restarting the server (look at siege -b)
[x] Availability should be above 99.5% for a simple get on an empty page with a siege -b on that page.
평가 항목
Check the code and ask question
brew install siege
brew install telnet
select
,read
,write
검색.read/recv/write/send
에 대하여 에러처리가 돼있는지 확인한다.read/recv/write/send
에 대해 return 값 -1, 0 두개 모두 처리됐는지 확인해야한다.errono
쓰지 말자Configuration
location /post_body
의limit_client_body_size
값을 10으로 변경curl -X POST localhost:8080/post_body -d "0123456789"
curl -X POST localhost:8080/post_body -d "012345678911"
curl -I HEAD http://localhost:8080/head
Run the Tester
Check Headers
http://localhost:8080
접속en
와ko
,ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
에 따라 다른 언어의 index 페이지가 응답으로 온다.Port Issues
8080
,8081
접속 ㄱㄱSiege
siege http://localhost:8080 -b
lsof -p wevserv_process_id
를 터미널에 입력하고 CLOSED_WAIT 가 존재하면 hanging connection이 존재한다.