1.의존 라이브러리 설치.

  • php 설치에 앞서 필요한 의존 라이브러리들을 설치합니다.
yum -y install gcc* make libtool-ltdl-devel openssl-devel pcre-devel ncurses-devel libxml2-devel bzip2-devel curl-devel gdbm-devel libjpeg-devel libpng-devel freetype-devel imap-devel libc-client-devel krb5-devel libmcrypt libmcrypt-devel libmhash-devel flex icu libicu libicu-devel gd gd-devel openldap-devel php-devel

2. Libiconv 등 필수 라이브러리 설치

  • php 설치에 앞서 make 파일 생성(compile) 에 필요한 라이브러리들을 다운받고 설치합니다.
cd /home1/username/stage
sudo wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
sudo tar xvzf libiconv-1.15.tar.gz
cd libiconv-1.15
sudo ./configure --prefix=/usr/local/
sudo make && make install

# PHP 설치시 –with-ldap 옵션을 사용하기위해 아래와 같이 심볼릭 링크를 추가시켜 줍니다.

ln -s /usr/lib64/libldap.so /usr/lib/libldap.so

ln -s /usr/lib64/libldap_r.so /usr/lib/libldap_r.so

3. php 소스 파일 다운 후 configure 실행

http://php.net/downloads.php 사이트에 접속 후 php 다운로드

  • php-x.x.x.tar.gz 파일은 커스텀 설치가 가능한 소스파일입니다.
  • configure는 make 파일을 생성해주는 파일입니다. 생성된 make파일을 통해 컴파일을 진행할 것입니다.
  • configure에 다양한 옵션을 넣어주어 (경로지정, db지정, 라이브러리 연동 등) make파일을 생성하여 줍니다.
# 압축 해제 후
cd /home1/username/stage/php-7.X.X

sudo ./configure \
-prefix=/home1/username/apps/php7.1 \
-with-config-file-path=/home1/username/apps/php7.1/etc \
-disable-debug \
-enable-fpm \
-enable-bcmath \
-enable-exif \
-enable-ftp \
-enable-gd-native-ttf \
-enable-inline-optimization \
-enable-intl \
-enable-mbregex \
-enable-mbstring \
-enable-mod-charset \
-enable-sigchild \
-enable-soap \
-enable-sockets \
-enable-sysvsem=yes \
-enable-sysvshm=yes \
-enable-xml \
-enable-zip \
-with-bz2 \
-with-iconv=/usr/local \
-with-curl \
-with-zlib \
-with-gd \
-with-gettext \
-with-mcrypt \
-with-mhash \
-with-pdo-mysql \
-with-mysqli \
-with-openssl \
-with-xmlrpc \
-with-freetype-dir=/usr/lib64 \
-with-jpeg-dir=/usr/lib64 \
-with-libxml-dir=/usr/lib64 \
-with-png-dir=/usr/lib64 \
-with-zlib-dir=/usr/lib64 \
-with-fpm-user=username \
-with-fpm-group=username \
-with-ldap

#... 기타 옵션이 필요할경우 추가.

**####만약 configure 컴파일 도중 오류가 난다면, library경로나 설치가 제대로 안되어있는것!**
==================오류 해결 =================================
#iconv 오류
iconv 라이브러리의 경로를 확인해볼것!!(아니면 재설치)

#ldap.h 오류
sudo yum install openldap-devel

#Cannot find ldap libraries in /usr/lib. 오류
sudo cp -frp /usr/lib64/libldap* /usr/lib/


==============================================================

4. configre 실행 성공 및 make 파일 생성 완료

  • Thank you for using php라는 메세지가 뜨면 성공적으로 만들어진 것입니다.

5. make 및 make install 진행.

sudo make
sudo make install

6. php.ini파일 을 nginx로 복사하여준다.

sudo cp /home1/username/stage/php-7.2.3/php.ini-development /home1/username/apps/nginx/conf/php.ini


설치법 - nginx와 php연동

nginx는 php-fpm이 설치되어 있어야 연동이 가능합니다.

1. conf 파일 원본 복사

cd /home1/username/apps/php/etc/
sudo cp -arp php-fpm.conf.default ./php-fpm.conf

2. www.conf 복사

cd /home1/username/apps/php/etc/php-fpm.d/
sudo cp www.conf.default www.conf

3. php-fpm실행

sudo /home1/username/apps/php/sbin/php-fpm

-> php-fpm실행시 오류가 안나야함


4.nginx.conf 파일 수정

->nginx와 php가 연동할 수 있도록 nginx파일을 수정하도록 합니다.

sudo vi /home1/username/apps/nginx/conf/nginx.conf
# 주석 해제후 수정 또는 아래 내용 삽입

location \~ .php$ {
            root           /home1/username/apps/nginx/html;
            fastcgi\_pass   127.0.0.1:9000;
            fastcgi\_index  index.php;
            fastcgi\_param  SCRIPT\_FILENAME  $document\_root$fastcgi\_script\_name;
            include        fastcgi\_params;
        }

5. php 구동 테스트

cd /home1/username/apps/nginx/html
echo "<?php phpinfo(); ?>" >> phpinfo.php

-> phpinfo 창이 정상적으로 뜨게되면 연동에 성공!

Server log:

tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log

Agent log:

tail -f /var/log/cloudera-scm-agent/cloudera-scm-agent.log

or

tail -f /var/log/messages
 

개요

  • impala-shell 소스 분석을 위한 포스트.
  • 개인 연구/분석 목적으로 포스트를 작성하였으며, 참고용으로만 활용 할 것.
  • Cloudera / Python 2.6.6 기반에서 설치된 impala-shell을 분석함.
  • impala-shell 경로
    • 메인소스 : /opt/cloudera/parcels/CDH/lib/impala-shell/impala_shell.py
    • client/ data driven : /opt/cloudera/parcels/CDH/lib/impala-shell/lib/

 

 

메인 Source(impala_shell.py)

Location : /opt/cloudera/parcels/CDH/lib/impala-shell/impala_shell.py

select 처리 메소드.

  • impala_shell.py - do_select()
  • impala에서 select 관련 문법이 나올경우 처리 로직.
  • Query beeswax 후, _excute_stmt()로 쿼리 처리.
def do_select(self, args):
    """Executes a SELECT... query, fetching all rows"""
    query = self.imp_client.create_beeswax_query("select %s" % args, self.set_query_options)
    return self._execute_stmt(query)

 

 

모든 쿼리문을 실행시키는 로직 메소드.

  • impala_shell.py - _execute_stmt(self, query, is_insert=False)
  • 클라이언트가 쿼리를 실행하면 query_handle이 즉시 반환됩니다. 이 때, 쿼리 DML이 INSERT가 아닐경우 생성기를 사용하여 스트리밍 될 때 클라이언트에서 결과를 가져옵니다. 실행 시간이 출력되고 쿼리가 아직 종료되지 않은 경우 닫힙니다.
def _execute_stmt(self, query, is_insert=False):
...
    self.last_query_handle = self.imp_client.execute_query(query)
...

 

 

클라이언트 처리 Source(impala_client.py)

  • Location : /opt/cloudera/parcels/CDH/lib/impala-shell/lib/impala_client.py

 

execute 쿼리 핸들러

  • impala_client.py - execute_query(self, query)
  • 상위 메소드인 impala_shell._execute_stmt에 쿼리 핸들링정보와 쿼리 상태(Error or success . etc.)를 리턴.
  • _do_rpc () : 일종의 소켓 체크/ 쿼리 검증 과정.
def execute_query(self, query):
    rpc_result = self._do_rpc(lambda: self.imp_service.query(query))
    last_query_handle, status = rpc_result
    if status != RpcStatus.OK:
      raise RPCException("Error executing the query")
    return last_query_handle

 

 

fetch 메소드

  • impala_client.py - fetch(self, query_handle)
  • 쿼리 실행 후 row 결과를 출력/ 처리하는 메소드.
  • 여기서 인코딩을 확인해보자 !
  def fetch(self, query_handle):
    """Fetch all the results.
    This function returns a generator to create an iterable of the result rows.
    """
    result_rows = []
    while True:
      rpc_result = self._do_rpc(
        lambda: self.imp_service.fetch(query_handle, False,
                                       self.fetch_batch_size))

      result, status = rpc_result

      if status != RpcStatus.OK:
        raise RPCException()

      result_rows.extend(result.data)

      if len(result_rows) >= self.fetch_batch_size or not result.has_more
        rows = [row.split('\t')  for row in result_rows]
        result_rows = []
        yield rows
        if not result.has_more:
          break

 

Impala Service 모듈

  • Location : /opt/cloudera/parcels/CDH/lib/impala-shell/gen-py/ImpalaService/ImpalaService.py
  • Impala-shell에서 사용되는 인스턴스 클래스 정보를 모아놓은 모듈.

 

Client 클래스

class Client(beeswaxd.BeeswaxService.Client, Iface):
  def __init__(self, iprot, oprot=None):
    beeswaxd.BeeswaxService.Client.__init__(self, iprot, oprot)

 

Impala Beeswaxd 모듈

  • Location : /opt/cloudera/parcels/CDH/lib/impala-shell/gen-py/beeswaxd/BeeswaxService.py
  • 이름(밀랍)처럼 Query를 이어 붙인 뒤, 쿼리를 실질적으로 핸들링 하는 모듈.

 

Client 클래스

class Client(Iface):
  def __init__(self, iprot, oprot=None):
    self._iprot = self._oprot = iprot
    if oprot is not None:
      self._oprot = oprot
    self._seqid = 0
...

  def query(self, query):
    """
    Submit a query and return a handle (QueryHandle). The query runs asynchronously.

    Parameters:
     - query
    """
    self.send_query(query)
    return self.recv_query()


...

  def send_query(self, query):
    self._oprot.writeMessageBegin('query', TMessageType.CALL, self._seqid)
    args = query_args()
    args.query = query
    args.write(self._oprot)
    self._oprot.writeMessageEnd()
    self._oprot.trans.flush()

...

 

 

 

 

방법1) screenrc 이용

sudo vi /etc/screenrc

#맨 아랫 줄 아래 내용 추가

...
...
...
caption always "%{= kw}%-w%{= gW}%n %t%{-}%+w %-=  %Y-%m-%d %C:%s"

 

방법 2) 화면 명령 입력 모드 이용

1. screen 명령어 이용하여 세션 접속.

screen -S test

 

2. 화면 명령 입력 모드

Ctrl + a + : 

 

3. 화면 명령 입력 모드 상태에서  캡션 추가

caption always "%{= kw}%-w%{= gW}%n %t%{-}%+w %-=  %Y-%m-%d %C:%s"

 

 

# window tab 커맨드 설명

caption always : 창 캡션 표시를 화면 맨 아래에 한 줄로 표시.
%{= kw} : 모든 현재 속성 지우기, 배경을 검은 색, 텍스트를 흰색으로 설정
%-w : 모든 창 번호 및 이름을 현재 창까지 표시
%{= gW} : 현재 창 설정 속성, 배경을 녹색으로 설정, 텍스트를 밝은 흰색으로 설정
%n : 현재 창에 숫자 추가
%t : 이름 추가
%{-}  : 마지막 속성 변경 취소
%-= : 터미널 너비를 채우기 위해 문자열간의 간격 설정
%Y-%m-%d %C:%s : 현재 표시 날짜와 시간

결과 

 

Reference ::
http://bigdatums.net/2017/03/25/how-to-display-window-tabs-in-linux-screen/

컴포저란 ?

centos에는 yum, rpm 등 패키지 관리 도구 등이 있다.
php 라이브러리를 자동으로 선언해주는 점에서 composer 또한 패키지 관리 도구로 착각 하기 쉽지만, 엄연히 따지고보면 composer는 php 프로젝트에서 사용하는 의존성 관리 도구이다.

1. composer 설치 

curl -sS https://getcomposer.org/installer | php

 

2. 전역사용을 위하여 bin에 등록.

 sudo mv composer.phar /usr/bin/composer

 

3. composer install(라이브러리 선언)

cd /path/to/project
composer install 

패키지 설치 대신 소스 설치 해야 하는 이유 ?

여러가지 이유가 있지만, 실 업무를 진행하며 느낀 개인적인 견해로는....

 

1. 버전 변경에 용이)
apps 전용 폴더 설정 후, S-링크만 연결하여주면 기존 버전 변동없이 바로 버전 up/down 가능. 
(ex: ln -s ~/apps/nginx-1.0.1 ~/apps/nginx   <-->  ln -s ~/apps/nginx-1.1.1 ~/apps/nginx)

 

2. 루트 권한 없이도 유저 or 그룹 단위로 엔지니어링 가능)
패키지 설치와 달리 지정한 폴더로 설치되기 때문에 root 권한이 필요하지 않음.

 

3. 새로운 환경의 서버로 이동할 경우 복구가 용이)
초기 설치한 옵션을 init.sh로 만들면 쉽게 새로운 서버에서 손쉽고 빠르게 재 설정 가능.

 

4. 의존성 문제 크게 없음.

 

1. 설치 전 준비 사항

#pcre 라이브러리 설치
sudo yum -y install pcre*

#gzip 압축을 사용하기 위해서 설치
sudo yum -y install zlib zlib-devel

#open ssl 설치
sudo yum -y install openssl openssl-devel

 

 

2. nginx 다운로드

cd /home1/username/stage
wget https://nginx.org/download/nginx-1.12.0.tar.gz
tar -xvzf nginx-1.12.0.tar.gz

 

3. nginx 컴파일 설치

cd /home1/username/stage/nginx-1.12.0

#NginX 폴더안에 있는 내용 컴파일 
sudo ./configure --prefix=/home1/username/apps/nginx-1.12.0 --user=username --group=username --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module

#make, install
sudo make
sudo make install

#심볼릭 링크 연결
ln -s /home1/username/apps/nginx-1.12.0 /home1/username/apps/nginx

 컴파일 옵션 설명

  • --prefix=경로 : 컴파일후 설치되는 경로
  • --user=사용자계정 : 엔진엑스 작업자 프로세스를 실행하기 위한 기본 사용자 계정 (이설정은 환경설정 파일에 user 지시어를 생략했을 경우에만 적용된다.)
  • --group=그룹 : 엔진엑스 작업자 프로세스를 실행하기 위한 기본 사용자 그룹 (이설정은 환경설정 파일에 group 지시어를 생략했을 경우에만 적용된다.)
  • --width-http_realip_module : 요청 헤데 데이터로부터 실제 IP 주소를 읽어 내는 Real IP 모듈
  • --with-http_stub_status_module : 서버 통계와 정보페이지를 생성하는 스터브 상태
  • 기타 컴파일시 옵션 추가 할 수 있음.

4. nginx conf 수정

여러 사이트를 동시에 nginx에 올려야  할 경우,
conf/nginx.conf를 직접 수정하기 보다는 conf를 각각 작성하여 include 하는 방식을 권장 합니다

  • sites-available 디렉토리에 사이트별로 각각 conf 작성.
  • sites-enabled 디렉토리에 사용할 사이트를 심볼릭링크로 등록.
  • nginx.conf에서 sites-enabled디렉토리를 include.

 

sites-available 디렉토리에 사이트별로 각각 conf 작성.

mkdir -p ~/apps/nginx/conf/sites-available

cd ~/apps/nginx/conf/sites-available

vi test.com.conf
#내용 작성
#test.com.conf
server {
        listen       80 default_server;
        listen       localhost default_server;

		#root 변경!
        location / {
            root   /home1/username/apps/nginx/html/path/to/project;
            index  index.php index.html index.htm;
                try_files $uri $uri/ /index.php?$query_string;
        }
        
        #php-fpm 연동할 경우 아래 내용도 설정.
        location ~ \.php$ {
                root    /home1/username/apps/nginx/html/path/to/project;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
        }
}

 

sites-enabled 디렉토리에 사용할 사이트를 심볼릭링크로 등록.

mkdir -p ~/apps/nginx/conf/sites-enabled

cd ~/apps/nginx/conf/sites-enabled

ln -s ../sites-enabled/test.com.conf

 

nginx.conf에서 sites-enabled디렉토리를 include.

#nginx conf 수정
cd /home1/username/apps/nginx/conf
vi nginx.conf

...
#user  nobody;
worker_processes  auto;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

 #   access_log  logs/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    server_tokens       off;
    keepalive_timeout   65;
    types_hash_max_size 2048;

        include /home1/username/apps/nginx/conf/sites-enabled/*;
}

5. nginx 실행

#nginx 실행
sudo /home1/username/apps/nginx/sbin/nginx

#nginx 중지
sudo /home1/username/apps/nginx/sbin/nginx -s stop

#nginx conf reload
sudo /home1/username/apps/nginx/sbin/nginx -s reload

 

 

6. ip주소로 접속하여 nginx 구동 확인.

+ Recent posts