다음쪽 IP에서 무차별적으로 긁어가는 웹페이지 접속때문에
서버부하가 순간순간 너무 올라가서 골치거리였습니다.ㅠㅠ (어디에 쓰는건지도 모른다는....)
IP도 C클래스 대역 몇개로 해서 특정IP를 막는것도 그렇고, agent를 보니 Daum Raam/Daum OA 이런식..ㅠ
통상적으로 검색엔진이 초당 수개~ 수십번 접속을 하지 않습니다.
일단 서버부하를 너무 유발하여 막기로 결정~ nginx로 막아보았네요..
nginx의 limit_req_zone 는 server / http/ location 절에만 기술이 가능하므로 아래와 같이 해결했네요.
map $http_user_agent $limit_bots {
default '';
~*(Daum|Raam) Daum;
}
limit_req_zone $limit_bots zone=antiddos:20m rate=3r/s; # 초당 3개로 제한
당연히 적당한곳에 아래도 기술해야겠지요.
limit_req zone=antiddos burst=3; # 초당 3개 제한이 초과될때 3개까지 대기허용?
검색엔진이 컨턴츠를 가져가려면, 서버부하를 고려해서 적당히 가져가는 센스를 보여줘야 하는데.
정도가 심해서 부득이 하게 막았네요.ㅠㅠ
아파치도 비슷하지만, NGINX에서 PHP프레임웍을 사용하려면,
보통 아래와 같이 기술하게 된다.
rewrite ^/(.*)$ /index.php?/$1 last;
}
# 파일이 존재하지 않으면, 프레임웍의 index.php 로 rewrite
이런경우 없는 이미지파일 호출이나 css, js 파일을 호출하더라도.
파일이 없는경우 무조건 index.php 로 가게 되니 서버의 부담이 많아진다. (악의적인호출포함?)
아래와 같이 수정
set $framework 'NO';
if (!-e $request_filename) {
set $framework 'OK';
}
if ($uri ~ '(\.css|\.js|\.ico|\.gif|\.jpg|\.png|\.swf)')
set $framework 'NO';
}
if ($framework = 'OK') {
rewrite ^/(.*)$ /index.php?/$1 last;
break;
}
위와 같이 하여 확장자가 이미지파일이거나 css/js 등일 경우 파일이 존재하지 않으면, 프레임웍을 안타게 설정한다.
확장자는 알아서 추가..ㅎㅎ
php-fpm 실행시 unknown entry 'security.limit_extensions' error
pph-fpm을 로컬에서 실행할때와 달리 다른서버의 php-fpm을 실행할때 'security.limit_extensions' 를
기술해주어야한다. (was서버처럼 분산처리할때)
Starting php-fpm server...
[08-Apr-2014 19:14:46] ERROR: [/usr/local/etc/php-fpm.conf:17] unknown entry 'security.limit_extensions'
[08-Apr-2014 19:14:46] ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
[08-Apr-2014 19:14:46] ERROR: FPM initialization failed
php-fpm.conf 에
security.limit_extensions 를 아무데나 기술하면 위와 같이 에러가 나므로
반드시 [www] 탭 하단에 기술해주어야한다.
[www]
security.limit_extensions = .php .php3
모니위키(moniwiki) 를 사용하시는분이 요즘 있을까 하지만,
자료찾기가 좀 쉽지 않아서 정리해봅니다.
http://wiki.test.com/wiki.php/xxxxxxxxxxx
이런식의 URL방식을 사용하기 때문에
모니위키를 nginx 에서 사용하시려면, 아래와 같이 추가하셔야하시면 됩니다
참고하세요~ ㅎㅎ
try_files $uri $uri/ /wiki.php;
location ~ \.php($|/) {
include fastcgi_params;
fastcgi_pass unix:/var/run/fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param HOST testserver
fastcgi_read_timeout 120;
..
..
}
파일다운로드 파일서버겸용 웹서버 가 트래픽 1G로 FULL 서비스하게 되었네요.
웹서버는 nginx
1G FULL서비스상황에서 load는 0.x 대.. ㅎㅎ
1000M 랜카드 대역폭의 한계치 까지와서
서버에 붙어 있는 랜카드2개를 라운드로빈하기로 결정..
FreeBSD의 커널부터 패치 하기 시작!
device lagg
추가후 커널컴파일
vi /boot/loader.conf 에
추가! 후 리부팅
vi /etc/rc.conf 에 랜설정
ifconfig_bce1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto roundrobin laggport bce0 laggport bce1"
ipv4_addrs_lagg0="27.x.x.171/25"
두개의 랜카드가 라운드로빈되면서 분산시작! ㅎㅎ
LAN1 LAN2
분산이 잘되고 있네요.ㅎㅎ
그나저나 nginx가 짱!
nginx에 재미 있는 Addons기능중에 echo 라는 기능이 있다.
nginx단에서 간단하게 특정 코드를 출력할 수 있는 기능이다.
https://github.com/agentzh/echo-nginx-module/tags
echo모듈을 다운받고,
nginx컴파일시 echo모듈의 경로를 아래와 같이 추가한다.
./configure --prefix=/usr/local/nginx --add-module=./echo-nginx-module
컴파일후 nginx.conf 에 아래과 같이 추가한다.
location /hello {
#default_type text/plain; # 옵션
echo "hello, world!";
}
도메인이 abc.com 이라면,
접속시 hello, world! 를 표시해줄것이다.
나같은 경운 crossdomain.xml 을 echo모듈로 사용했다. 로컬하드에 파일이 없어도 웹서버단에서 자동처리될 것이다.
location /crossdomain.xml {
echo "<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">";
echo "<cross-domain-policy>";
echo "<allow-access-from domain=\"*\" />";
echo "<allow-http-request-headers-from domain=\"*\" headers=\"*\" />";
echo "</cross-domain-policy>";
}
http://abc.com/crossdomain.xml 하면 자동으로 나올것이다.
참고로 이 파일은 플래쉬파일에서 crossdomain관련 참조하는 파일이다.
nginx 에서 rewrite기능을 사용하면 기본적으로 request_uri 가 붙는다..
가령, www.abc.com/test/index.php?a=123 을 아래의 룰로 redirect하면
rewrite ^/test/ / permanent;
www.abc.com/test/?a=123
결과
www.abc.com/?a=123
으로 되어 버린다~
아래와 같이 하면 깔끔하게 해결~
rewiret ^/test/ /? permanent;
www.abc.com/test/?a=123
결과
www.abc.com/
사소하지만 이거 찾는데 시간이 좀 걸렸따아~;ㅋ
ssl 인증서는 서버당 한개의 인증서만 설치됩니다. (기본포트 443)
여러개를 설치하려면,
1. 멀티인증서를 사용한다. 그러나 최소4개의 도메인에 대한 인증서와
만기일을 항상 맞춰야한다는 단점이 있으며, 인증서 추가시 모든인증서를 다시 받아야하는 단점이 있다.
2, 다른방법으로는 ssl 포트번호를 바꾸는방법인데..
기본적으로 http://xxx:444 와 같이 별도 포트로 연결처리를 해야한다.
3. 서버에 IP를 추가할당하여 각각 IP로 인증서설치(nginx에서만 됨)
nginx에서 동일한 ssl 기본포트(443)로 여러개의 인증서를 설치하려면,
기본적으로 서버에 IP를 별도로 할당할 수 있어야합니다~ (아파치에서는 안됨)
$ ifconfig
bce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=401bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,VLAN_HWTSO>
ether 78:2b:cb:4a:74:36
inet 110.x.x.92 netmask 0xffffff00 broadcast 110.92.254.255
inet 110.x.x.93 netmask 0xffffffff broadcast 110.92.254.93
media: Ethernet autoselect (1000baseTX <full-duplex,flowcontrol,master,rxpause,txpause>)
status: active
그다음 nginx.conf 를 아래와 같이 기술
server {
listen 110.x.x.92:443;
server_name www.abc.com;
ssl on;
ssl_certificate cert/chain.crt;
ssl_certificate_key cert/server.key;
..
..
}
server {
listen 110.x.x.93:443;
server_name www.bbc.com;
ssl on;
ssl_certificate cert2/chain.crt;
ssl_certificate_key cert2/server.key;
..
..
}
두IP에 대한 443포트가 띄워져있는걸 볼 수 있네요~
$netstat -na | grep LISTEN
tcp4 0 0 110.x.x.93.443 *.* LISTEN
tcp4 0 0 110.x.x.92.443 *.* LISTEN
nginx로 proxy서버로 사용할때 목적지서버의 404나 403 등의 에러응답코드를
다른것으로 변조하고 싶은경우가 있다.
이럴경우 아래의 코드를 삽입해서 proxy서버에서 직접 콘트롤 가능하게 할 수 있다.
xxx
proxy_intercept_errors on;
error_page 403 /403.jpg;
proxy서버에서 특정페이지로 redirect하거나 여러가지 일을 할 수 있다.