레이블이 nginx인 게시물을 표시합니다. 모든 게시물 표시
레이블이 nginx인 게시물을 표시합니다. 모든 게시물 표시

20140911

NGINX + SSL + SPDY

SPDY 란? http://helloworld.naver.com/helloworld/140351


NGINX 컴파일 옵션




NGINX 설정



Firefox Add-on

https://addons.mozilla.org/ko/firefox/addon/spdy-indicator/

20140817

nginx 기본 정보 수정

이 요약은 사용할 수 없습니다. 이 글을 보려면 여기를 클릭하세요.

nginx 국가별 대역폭 (using geoip)

Nginx 에서 GeoIP 를 이용해 국가별로 접속 대역폭을 설정할수 있습니다.
Maxmind 에서 제공하는 GeoLite 국가  데이터베이스 CSV 를 다운로드 합니다.

# wget  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
# unzip GeoIPCountryCSV.zip
Archive:  GeoIPCountryCSV.zip
inflating:  GeoIPCountryWhois.csv

CSV 내용을 국가별 아이피 대역, 국가명으로 간단하게 Perl Script 로 분리 하여 따로 저장  합니다.

변경 전 :  "1.11.0.0","1.11.255.255","17498112","17563647","KR","Korea, Republic of"
변경  후 : 1.11.0.0/16 KR;

# wget  http://mirror.yongbok.net/ruo91/nginx/script/geo2nginx.pl
#  chmod +x geo2nginx.pl
# ./geo2nginx.pl <  GeoIPCountryWhois.csv >  /usr/local/etc/nginx/nginxGeo.txt

nginx.conf 파일의 http 부분에 추가

geo $country {
    default no;
    include  /usr/local/etc/nginx/nginxGeo.txt;
}

가상호스트 부분인 server 부분에  대역폭 설정 구문을 추가

if ($country ~ ^(?:US|CA|ES)$ ){
    set  $limit_rate 500k;
}
if ($country ~ ^(?:RU|CN)$ ){
    set $limit_rate  1k;
}


nginx 대역폭 제한

nginx.conf 수정

location ... { 

    최대 대역폭
    limit_rate 200k;

    일정 용량을 전송 제한
    limit_rate_after 원하는용량M;

}

20130613

nginx proxy

음.. 계속 말하겠지만. 난 돈 쓰는걸 많이 싫어하는 편이다.

투자에 인색하다고 하지 말아라.

특별한 투자 없이 처리할 수 있고 비용을 줄일 수 있으면 줄이는 게 당연한 것이다.

비록 난 대표는 아니지만 내 회사라는 마음이 있고 회사 돈을 아낀다면.. 그게 맞다는 것이다.

하지만 고민할 수 있는 위치가 아니거나 고민하다가 시간을 많이 소비한다면 오히려 그건 회사에게 더 실이 될 수 있으니 조심하자. (인건비가 요즘 장난 아닌지라...)


자. 최근 테라급 데이터를 다루다보니 당연히 눈길이 스토리지 서버에 갈 수 밖에 없는 상황이 생기고 스토리지가 생기더라도 아무리비싸고 좋고 훌륭한 raid를 써서 사용하더라도 결국 사고터지만 백업에 의존하는 상황이 생기기 마련이다.


그러다보니 스토리지를 과감히 포기하고 다른 방법을 택해보았다.


역시 돈이 없기 때문에 L4를 사용할 생각 조차 하지 않았다.

그리고  LVS는 몇 번 구축했지만 내가 원하는 성능을 내지를 못 했다.

내 욕구에 충족하는 수준이 nginx proxy이다.

이 놈 멋지다....

단순 i/o라면 발란스 관리하는 놈만 만들면 아주 아주 퍼팩트한 운영이 가능하다.


방법은 아래와 같다.



 
 192.168.0.x
Proxy 1  --monit-> Proxy 2   -monit->  Proxy 3  -monit -> Proxy 1 (cycle 모니터링)


Web 192.168.101.x 대역        
Web 192.168.101.1(10TB)  <-- sync --> Web 192.168.101.2(10TB) (cycle 모니터링)


Web 192.168.102.x 대역        
Web 192.168.102.1(10TB)  <-- sync --> Web 192.168.102.2(10TB) (cycle 모니터링)


Web 192.168.103.x 대역        
Web 192.168.103.1(10TB)  <-- sync --> Web 192.168.103.2(10TB) (cycle 모니터링)




1) Proxy 들은 각자 1명씩의 Proxy를 감시하여 Proxy 장애를 모니터링 하게 된다.
2) 각 Web의 대역은 서로 service 및 모니터링을 관활하게 된다. (실 운영은 2대보다 많아야지?)
3)  외부에서 접속이 할 경우 proxy 에서 rewrite 를 활용하여 서버에서의 응답을 return 처리
4) Proxy 에서는 Web 대역을 모니터링하여 upstream 을 조정 및 발란스 처리


1-4번까지의 기능의 데몬을 만들면... 오픈 소스를 통하여 대용량 스토리지처럼 운영할 수 있게 된다.


음...

좀 이해가 안되나?..

그냥 고민해보면... 디게 쉽다.

이런식으로 현재 운영을 하고 있는데... 물론 100% 동일하지는 않고 부수적인 것들이 좀 있기는 하지만... proxy 상단에 cdn이 있고 뭐 등등...

암튼 기본적인 이런 형태면 트래픽에 따른 proxy 추가와 용량에 따른 Web 대역을 늘리는 것으로 100 * 10TB정도의 용량은 가능해지게 된다. ㅡㅡ;;

물론 현재 초기 시범 서비스라... 이게 정답인지는 모르겠다...



어떤이는 이렇게 말한다.. 아 복잡해 걍 스토리지 몇대 넣고 L4넣죠... 라고 하는...


누군 그게 좋은지 몰라서 그러냐... 돈이 없다. 돈이 없어.

20130612

CentOS5.x에 nginx, php-fpm, mariadb, memcache, barcode 등 프로그램 설치

현재 업무 중 많은 부분이 쇼핑몰과 SCM, ERP 등이다..

평균 동접은 약 1,000명 수준이다보니 단일 서버는 어렵고 분산 처리 방식으로 개발이 된다.


그에 맞는 서버 설정을 구성하였고 기록을 남긴다.

울 회사에서 내 포지션은 개발 관련 총책임자로 있어 돈이 들어가는 걸 기본적으로 싫어하는 나는 무료/오픈 소프트웨어 로 주로 사용하며 중국에서 근무하는 상황에서 개발인력 확보가 어렵고 인건비가 상당히 비싼 점을 고려한 세팅이다.

초기 개발 시에는 JAVA도 사용하였지만 현재는 다 걷어낸 상황이다.


대략 정리하면 아래와 같다.

Language : php-fpm(web), python & shell(server inside)

OS : CentOS5.x 64bit

Software : nginx(web or proxy), php,  python, memcache, mmonit, munin, sphinx, mysql or mariadb, imagemagick, genbarcode(barcode), ioncube, goaccess


설치 과정.

1. 우선 CentOS 설치시에 모든 패키지를 제거하고 최소화로 하여 설치를 진행한다.


2. 64bit를 기준으로 설치하였기 때문에 32bit 소프트웨어는 제거.
 # yum remove \*.i\?86

3. yum 으로 설치되는 부분이 있기 때문에 yum.conf 에다가 64bit 소프트웨어만 설치하도록 32bit 소프트웨어는 exclude 처리한다.
# vi /etc/yum.conf

exclude = *.i?86  #add exclude


4. yum으로 기본 패키지 정리.
#  yum -y remove php httpd mysql bind dhclient tftp inetd xinetd ypserv telnet-server rsh-server vsftpd tcsh nfs* samba tftp-server telnet system-config-printer
#  yum -y install system-config-date subversion gcc gcc-c++ g++ cpp make ncurses-devel automake autoconf tcl-devel rdate rsync pcre-devel gd-devel zlib zlib-devel curl curl-devel libcurl-devel openssl openssl-devel libopenssl-devel libtermcap-devel libc-client-devel bzip2-devel

5.ulmiit 설정
# ulimit -SHn 10240
# echo "ulimit -SHn 10240" >> /etc/rc.local

6. imagemagick 설치
# yum -y install ImageMagick*

7. iconv 설치 (source)
# tar zxvf libiconv-1.14.tar.gz
# cd libiconv-1.14
# ./configure --prefix=/usr/local
# gmake
# gmake install
# export LD_PRELOAD=/usr/local/lib/preloadable_libiconv.so

8. mysql or mariadb 설치 (2013년 이전에는 주변에서 데이터베이스 컨설팅 시에 돈 없으면 mysql을 사용하고 아주 아주 잘 설계하면 아주 아주 잘 버텨준다고 했다. 2013년 이후엔 mariadb를 추천해주고 있다. 이유는 explain 을 해보라. 그러면 알 것이다. 어차피 실 서비스는 정규화 설계로는 답없는 경우가 대부분이다.)


# groupadd mysql
# useradd -s /bin/false -g mysql mysql


8.1 mysql 설치 시... (5.6.x 기준)
# tar xvfz mysql-5.6.x.tar.gz
# cd mysql-5.6.x
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_EXTRA_CHARSETS=all -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DMYSQL_TCP_PORT=3306 -DENABLE_DTRACE=0


 8.2 mariadb 설치 시 (10.x.x 기준)
# tar xvfz mariadb-10.x.x.tar.gz
# cd mariadb-10.x.x
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_EXTRA_CHARSETS=all -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_ARIA_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL__ADDR=/tmp/mysql.sock -DSYSCONFDIR=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DMYSQL_TORT=3306 -DENABLE_DTRACE=0

mysql과 mariadb는 cmake 까지만 다르다..

# gmake
# gmake install
# echo /usr/local/mysql/lib >> /etc/ld.so.conf && ldconfig

설정 파일은 알아서 잘...(여기에 올려진 설정은 메모리 16GB기준의 서버의 설정이다)

# cp example.cnf /usr/local/mysql/my.cnf
# cp support-files/mysql.server /usr/local/mysql/bin/


# chmod 700 /usr/local/mysql/bin/mysql.server
# chown mysql. -R /usr/local/mysql
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

관리할 폴더 생성
# mkdir /usr/local/mysql/logs
# chmod 755 /usr/local/mysql/tmp
# chmod 755 /usr/local/mysql/logs
# chown -R mysql. /usr/local/mysql

링크 생성
# ln -s /usr/local/mysql/bin/mysql /usr/bin/


# echo "/usr/local/mysql/bin/mysql.server start" >> /etc/rc.local

# /usr/local/mysql/bin/mysql.server start
# /usr/local/mysql/bin/mysql_secure_installation


mysql이나 mariadb의 설치는 동일하다고 보면 된다.



replication (필요시...)
master 에서 실행
# show master status;

slave 에서 실행.
# CHANGE MASTER TO
 MASTER_HOST='master ip',
 MASTER_USER='마스터에 접속할 계정',
 MASTER_PASSWORD='마스터에 접속할 비밀번호',
 MASTER_LOG_FILE='마스터에서 정보 조회 후 설정',
 MASTER_LOG_POS=마스터에서 정보 조회 후 설정;

# START SLAVE;
Slave에서 err를 확인하여 아래의 메시지가 있으면 접속 성공
Slave I/O thread: connected to master 'useid@hostname:3306',replicat
ion started in log 'mysql-bin.00000x' at position xxx




9. php 설치

# tar zxvf php-5.x.x.tar.gz
# cd php-5.x.x
# yum -y install libxml2-devel libpng-devel freetype-devel freetype2-devel gmp-devel libmcrypt libmcrypt-devel gd libjpeg-devel glibc glibc-devel glib2 glib2-devel GeoIP*
# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc \
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-iconv=/usr/local \
--with-freetype-dir --with-jpeg-dir --with-png-dir --with-gd --enable-gd-native-ttf \
--with-mcrypt --with-curl --with-gmp --with-zlib --with-openssl --with-pear --with-bz2 \
--enable-mbstring --enable-mbregex --enable-bcmath --enable-inline-optimization -enable-sockets \
--enable-fpm

# gmake
# gmake install

# mkdir /usr/local/php/logs

# cp php.ini-production /usr/local/php/etc/php.ini
# rm -rf /usr/bin/php
# ln -s /usr/local/php/bin/php /usr/bin/

# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# vim /usr/local/php/etc/php-fpm.conf (알아서설정)

# echo "/usr/local/php/sbin/php-fpm" >> /etc/rc.local

# vim /usr/local/php/etc/php.ini (알아서설정)
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"

# /usr/local/php/sbin/php-fpm



10. ioncube loader 설치 (소스 중에 주요부분은 사용하고 있어서 사용. 근데 이거 은근 메모리 많이 먹는다.)

# wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
# tar xfz ioncube_loaders_lin_x86-64.tar.gz
# mv ioncube /usr/local/

# vim /usr/local/php/etc/php.ini
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.3.so (추가)
date.timezone = Asia/Shanghai (수정)





php 재시작
# killall php-fpm
# /usr/local/php/sbin/php-fpm


11. Zend 설치 (근데 요즘 사용안 하기 때문에 열외)

#  tar xvfpz ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
# mkdir /usr/local/zend/
# cp ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/ZendGuardLoader.so /usr/local/zend/

# vi /usr/local/php/etc/php.ini

[Zend]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_extension=/usr/local/zend/ZendGuardLoader.so

php 재시작
# killall php-fpm
# /usr/local/php/sbin/php-fpm







12. nginx 설치
# tar xzvf nginx-1.x.x.tar.gz
# cd nginx-1.x.x/

# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-http_geoip_module --with-http_realip_module --with-http_image_filter_module

# gmake
# gmake install
# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
# vim /usr/local/nginx/conf/nginx.conf (알아서 설정)

# /usr/local/nginx/sbin/nginx


13. GepIP
# yum -y install GeoIP GeoIP-devel GeoIP-data perl-Geo-IP
   
# vim /usr/local/nginx/conf/nginx.conf 에 추가
geoip_country /var/lib/GeoIP/GeoIP.dat;

해당 가상호스트 설정 부분의 php 설정에 추가
fastcgi_param  COUNTRY $geoip_country_code;


14. 바코드 설치

# wget http://mirror.yongbok.net/gnu/barcode/barcode-0.98.tar.gz
# tar xfvz barcode-0.98.tar.gz
# cd barcode-0.98
# ./configure
# gmake
# gmake install
# ldconfig

# wget http://www.ashberg.de/php-barcode/download/files/genbarcode-0.4.tar.gz
# tar xvfz genbarcode-0.4.tar.gz
# cd genbarcode-0.4
# gmake
# gmake install

php 예제....
# wget http://www.ashberg.de/php-barcode/download/files/php-barcode-0.4.tar.gz
# tar xvfpz php-barcode-0.4.tar.gz
# cd php-barcode-0.4


15. munin 설치 (nginx, php, mysql, mariadb 등의 plugin은 알아서들 설치)
# rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
# yum install munin-node -y
# vim /etc/munin/munin-node.conf
# chkconfig munin-node on
# /etc/init.d/munin-node start


16. monit 설치 (munin 이 정상적으로 잘 돌고 있는 지 감시의 목적)
# tar xvfz monit-x.y.z.tar.gz
# cd monit-x.y.z
# ./configure --prefix=/usr/local/monit
# gmake
# gmake install


17. goaccess 설치
# wget http://sourceforge.net/projects/goaccess/files/0.4.2/goaccess-0.4.2.tar.gz/download
# ./configure
# make
# make install

18. sphinx 설치... (이건 워낙 확장들이 많아서... 난 우선 중국에 있어 sphinx-chinese 를 사용)

참조 http://www.sphinx-search.com/ 여기 가면 친절히 설명이 되어있다.




tune 하는 부분은 따로 포스트 할 생각이다.


위의 내용은 아주아주 기본적인 설치이며... pmap으로 각 process를 모니터링 & 튠해야 한다.




Articles