AMP - WindyHana's Solanara

목차

개요

요구 라이브러리 설치

  1. OpenSSL: 윈디하나의 솔라나라: OpenSSL - Apache에 SSL라이브러리를 넣어 같이 컴파일 한다. 필요 없다면 생략할 수 있다.
  2. nghttp2

    # wget https://github.com/nghttp2/nghttp2/releases/download/v1.18.0/nghttp2-1.18.0.tar.xz
    # tar xvfJ nghttp2-1.18.0.tar.xz
    # cd nghttp2-1.18.0
    # OPENSSL_CFLAGS="-I/usr/local/ssl/include" OPENSSL_LIBS="-L/usr/local/ssl/lib -lssl -lcrypto" ./configure --disable-examples 1)
    # gmake
    # gmake install
    
    1) 64bit 로 컴파일하려면 CFLAGS="-m64" CXXFLAGS="-m64"를 추가한다.

    Apache HTTPd 2.4.17부터 추가된 HTTP/2 를 지원을 위한 mod_http2 를 컴파일하기 위해 필요한 라이브러리다.

  3. libedit

    # wget http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz
    # tar xvfz libedit-20150325-3.1.tar.gz
    # cd libedit-20150325-3.1
    # ./configure --enable-widec --disable-examples 1)
    # make
    # make install
    
    1) 64비트로 컴파일 하려면 CFLAGS="-m64"를 사용하자.
  4. Perl Compatible Regular Expressions

    # wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.bz2
    # tar xvfj pcre-8.39.tar.bz2
    # cd pcre-8.39
    # ./configure CFLAGS="-I/usr/local/include"\
      --enable-utf \
      --enable-unicode-properties \
      --enable-pcregrep-libz \
      --enable-pcregrep-libbz2 \
      --enable-newline-is-anycrlf \
      --enable-pcre16 \
      --enable-pcre32 \
      --enable-jit \
      --enable-pcretest-libedit 1) 2)
    # make
    # make install
    
    1) pcretest에 라인 편집 기능이 필요하지 않다면 이 줄을 제외하고 컴파일 해도 된다.
    2) 64비트로 컴파일 하려면 CFLAGS="-m64" LDFLAGS="-m64" CXXFLAGS="-m64"를 추가하고 컴파일 하자.
  5. zlib

    # wget http://zlib.net/zlib-1.2.8.tar.gz
    # tar xvfz zlib-1.2.8.tar.gz
    # cd zlib-1.2.8
    # ./configure
    # vi Makefile
    SFLAGS=-fast -fPIC -D_LARGEFILE64_SOURCE=1
    # make
    # make test
    ...
                    *** zlib test OK ***
    ...
                    *** zlib shared test OK ***
    ...
                    *** zlib 64-bit test OK ***
    `test' is up to date.
    # make install
    
  6. Libiconv

    # wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
    # tar xvfz libiconv-1.14.tar.gz
    # cd libiconv-1.14
    # ./configure --prefix=/usr/local --enable-static --enable-shared 1)
    # make
    # make install
    
    1) 64비트로 컴파일 하려면 CFLAGS="-m64"를 사용하자.
  7. Freetype

    # wget http://download.savannah.gnu.org/releases/freetype/freetype-2.7.tar.bz2
    # tar xvfj freetype-2.7.tar.bz2
    # cd freetype-2.7
    # GNUMAKE="gmake" ./configure --with-harfbuzz=no 1)
    # gmake
    # gmake install
    
    1) 64비트로 컴파일 하려면 CFLAGS="-m64" LDFLAGS="-m64"를 추가한다.
  8. Apache Portable Runtime

    # wget http://apache.mirror.cdnetworks.com/apr/apr-1.5.2.tar.bz2
    # tar xvfj apr-1.5.2.tar.bz2
    # cd apr-1.5.2
    # ./configure \
      --enable-nonportable-atomics \
      --enable-threads \
      --prefix=/usr/local 1)3)
    # make
    # make install 2)
    
    # wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.5.4.tar.bz2
    # tar xvfj apr-util-1.5.4.tar.bz2
    # cd apr-util-1.5.4
    # ./configure --with-apr=/usr/local/bin/apr-1-config \
      --with-ldap \
      --with-iconv=/usr/local \
      --with-openssl=/usr/local/ssl \
      --with-crypto=/usr/local/ssl 3)
    # make
    # make install
    
    1) --enable-nonportable-atomics옵션은 이식 가능하지 않은 (운영체제에 특화된) Atomic operations 을 사용하라는 의미다. GCC 4.1 이상에서는 __sync_val_compare_and_swap빌트인 함수를 사용하며, GCC를 사용하지 않는 솔라리스에서는 atomic_cas_ptr(3C)atomic_swap_ptr(3C)를 사용한다.
    2) APR 은 /usr/local 에 설치된다.
    3) 64비트로 컴파일 하려면 CFLAGS="-m64"를 사용하자.
  9. cURL 라이브러리

    # wget https://curl.haxx.se/download/curl-7.52.1.tar.bz2
    # tar xvfj curl-7.52.1.tar.bz2
    # cd curl-7.52.1
    # ./configure --with-ssl=/usr/local/ssl --with-nghttp2=/usr/local --with-ca-fallback 1) 2) 3)
    # gmake
    # gmake install
    
    1) 7.43.0 이후 버전부터 nghttp2 라이브러리와 같이 설치하면 HTTP/2를 지원한다.
    2) 윈디하나의 솔라나라: OpenSSL - CA 번들 인증서을 설치했다면, --with-ca-bundle=/usr/local/ssl/certs/ca-bundle.crt을 붙여 컴파일해 번들 인증서를 사용할 수 있다.
    3) 64bit 로 컴파일하려면 CFLAGS="-m64" LDFLAGS="-m64"를 추가한다.

Apache, PHP 설치

  1. MySQL

  2. The Apache HTTP Server

    The Apache HTTP Server Project
    root@wl ~/src # wget http://apache.mirror.cdnetworks.com//httpd/httpd-2.4.25.tar.bz2
    root@wl ~/src # wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
    root@wl ~/src # tar xvfj httpd-2.4.25.tar.bz2
    root@wl ~/src # tar xvfz mod_fastcgi-2.4.6.tar.gz
    root@wl ~/src # cd httpd-2.4.25
    root@wl ~/src/httpd-2.4.25 # ./configure \
      --prefix=/usr/local/apache2 \
      --enable-so \
      --enable-mods-static=all \
      --enable-proxy-http2 \
      --with-apr=/usr/local \
      --with-apr-util=/usr/local/apr \
      --with-pcre=/usr/local \
      --with-z=/usr/local \
      --with-ssl=/usr/local/ssl \
      --with-mpm=event \
      --with-nghttp2=/usr/local \
      --enable-mpms-shared='event prefork worker' 1) 2)
    root@wl ~/src/httpd-2.4.25 # make
    root@wl ~/src/httpd-2.4.25 # make install
    root@wl ~/src/httpd-2.4.25 # cd ../mod_fastcgi-2.4.6
    root@wl ~/src/mod_fastcgi-2.4.6 # cp Makefile.AP2 Makefile
    root@wl ~/src/mod_fastcgi-2.4.6 # wget -O fcgi.h http://www.solanara.net/downloads/fcgi.h 3)
    root@wl ~/src/mod_fastcgi-2.4.6 # make
    root@wl ~/src/mod_fastcgi-2.4.6 # make install
    
    1) 모든(all) 모듈을 정적 컴파일 하며, MPM을 event, prefork, worker 중 선택 가능하도록 컴파일하며 기본은 event를 사용한다. --enable-mods-static=all 대신 --enable-mods-static=reallyall을 사용하면 정말 모든 모듈을 컴파일하나 추천하지 않는다.
    2) 64bit 로 컴파일하려면 CFLAGS="-m64" LDFLAGS="-m64"를 추가한다.
    3) 아파치 2.4의 API가 변경되었기 때문에 컴파일시 오류가 발생한다. fcgi.h만 바꿔주면 된다. 다운로드한 fcgi.h파일은 아파치 2.4에서만 동작한다.
  3. PHP: Hypertext Preprocessor

    PHP: Hypertext Preprocessor
    root@wl ~/src # wget http://kr1.php.net/get/php-5.6.20.tar.xz/from/this/mirror
    root@wl ~/src # tar xvfJ php-5.6.20.tar.xz
    root@wl ~/src # cd php-5.6.20
    root@wl ~/src/php-5.6.20 # ./configure \
      --prefix=/usr/local/php \
      --with-mysql=mysqlnd \
      --with-mysqli=mysqlnd \
      --with-pdo-mysql=mysqlnd \
      --with-iconv=/usr/local \
      --with-gd \
      --with-jpeg-dir=/usr/local \
      --with-png-dir=/usr/local \
      --with-zlib-dir=/usr/local \
      --with-freetype-dir=/usr/local \
      --with-openssl=/usr/local/ssl \
      --with-openssl-dir=/usr/local/ssl \
      --enable-fpm \
      --enable-calendar \
      --with-curl=/usr/local \
      --enable-mbstring \
      --enable-mbregex \
      --enable-sigchild \
      --enable-pcntl \
      --enable-gd-native-ttf \
      --enable-wddx \
      --enable-sysvmsg \
      --enable-sysvsem \
      --enable-sysvshm \
      --enable-sockets \
      --enable-soap \
      --enable-ftp \
      --enable-exif \
      --enable-bcmath \
      --enable-zip \
      --enable-opcache \
      --enable-dtrace
    root@wl ~/src/php-5.6.20 # vi ext/sockets/conversions.c 1)
    #define _XPG4_2
    #define __EXTENSIONS__
    root@wl ~/src/php-5.6.20 # vi ext/sockets/php_sockets.h 2)
    #if defined (__sun) || defined (__sun__)
    
    /*
     * CMS_SPACE etc. definitions for Solaris 10, based on
     *   http://mailman.videolan.org/pipermail/vlc-devel/2006-May/024402.html
     * via
     *   http://wiki.opencsw.org/porting-faq#toc10
     */
    
    # ifndef CMSG_ALIGN
    #   ifdef __sun__
    #     define CMSG_ALIGN(len) _CMSG_DATA_ALIGN (len)
    #   else
          /* aligning to sizeof (long) is assumed to be portable (fd.o#40235) */
    #     define CMSG_ALIGN(len) (((len) + sizeof (long) - 1) & \
                                  ~(sizeof (long) - 1))
    #   endif
    # endif
    
    # ifndef CMSG_SPACE
    #   define CMSG_SPACE(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + \
                                CMSG_ALIGN (len))
    # endif
    
    # ifndef CMSG_LEN
    #   define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
    # endif
    
    #endif /* Solaris */
    root@wl ~/src/php-5.6.20 # make
    root@wl ~/src/php-5.6.20 # make install
    root@wl ~/src/php-5.6.20 # cp /usr/local/php/etc/php-fpm.conf.default  /usr/local/php/etc/php-fpm.conf
    root@wl ~/src/php-5.6.20 # cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    root@wl ~/src/php-5.6.20 # chmod +x /etc/init.d/php-fpm
    root@wl ~/src/php-5.6.20 # vi /etc/init.d/php-fpm
    #!/bin/sh 를 #!/bin/bash 로 변경
    root@wl ~/src/php-5.6.20 # cp php.ini-development /usr/local/php/lib/
    root@wl ~/src/php-5.6.20 # cp php.ini-development /usr/local/php/lib/php.ini 3)
    
    1) 솔라리스에서 _XPG4_2, __EXTENSIONS__ 매크로를 파일의 처음에 넣어준다. 타 운영체제에서는 할 필요 없다.
    2) 솔라리스의 경우 파일의 맨 앞에 CMSG_ALIGN, CMSG_SPACE, CMSG_LEN 매크로를 넣어준다. 출처는 코드에 명시되어있다.
    3) 서비스시에는 php.ini-production 을 기반으로 설정한다.
    --with-apxs2--enable-fpm
    이 문서에서는 FPM을 사용했지만, FPM은 PreFork 방식이라 대용량 웹 서버 운용시 메모리를 많이 소비한다. 메모리 사용량이 문제가 되는 경우 기존 방식인 apxs2 를 사용하는 방법이 더 좋다. configure 시 --enable-fpm 을 빼고 아래와 같이 해주면 된다.
    # ./configure \
      --with-apxs2=/usr/local/apache2/bin/apxs \
      ...
    # make
    # make install
    
    설치가 완료된 후 httpd.conf 에 FastCGI 설정 대신 아래와 같이 설정해야 한다.
    LoadModule php5_module        modules/libphp5.so
    AddType application/x-httpd-php	.php
    AddType application/x-httpd-php-source	.phps
    

    PHP 가속기
    PHP Opcode Cache를 통해 PHP 실행 성능을 향상시킬 수 있다. PHP 5.5 부터 Zend OpCache 가 번들되어있다. 자세한 사항은 윈디하나의 솔라나라: PHP - PHP 가속기를 읽어보자.

Apache, PHP 기본 설정

  1. PATH 설정

    apachectl 을 쉽게 실행하기 위해 PATH 환경변수를 수정하며, LD_LIBRARY_PATH에 아파치의 라이브러리 디렉토리를 넣자.
    root@wl ~ # vi /etc/profile
    ...
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apache2/lib; export LD_LIBRARY_PATH
    PATH=$PATH:/usr/local/apache2/bin; export PATH;
    root@wl ~ # . /etc/profile
    
  2. PHP, PHP-FPM 설정

    PHP 설정은 php.ini 에서 한다. 기본적으로 타임존을 설정해야 하며, include 디렉토리와 확장 라이브러리의 디렉토리 경로를 지정하자. 파일 업로드 기능을 사용하려면 최대 전송 가능한 크기를 지정해야 한다.
    root@wl ~ # vi /usr/local/php/lib/php.ini
    short_open_tag = On
    expose_php = Off
    ;max_execution_time = 0
    ;max_input_time = -1
    memory_limit = 256M
    error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    track_errors = Off
    html_errors = Off
    zend.assertions = -1
    post_max_size = 24M
    default_charset = "UTF-8"
    ;always_populate_raw_post_data = -1
    include_path = ".:/usr/local/php/lib/php"
    extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012"
    enable_dl = On
    upload_max_filesize = 20M
    date.timezone = Asia/Seoul
    date.default_latitude = 37.5780
    date.default_longitude = 126.9768
    ;session.save_handler = memcache
    ;session.save_path = "127.0.0.1:11211"
    ;zend_extension = opcache.so
    ;opcache.enable = 1
    opcache.fast_shutdown=1
    curl.cainfo = /usr/local/ssl/certs/ca-bundle.crt
    
    PHP-FPM 설정은 php-fpm.conf 에서 한다. 프로세스의 스케줄링을 아래와 같이 지정하자. 부하가 많은 서비스라면 프로세스의 개수를 늘여야 한다.
    root@wl ~ # vi /usr/local/php/etc/php-fpm.conf
    ...
    root@wl ~ # cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
    root@wl ~ # vi /usr/local/php/etc/php-fpm.d/www.conf
    ;listen = 127.0.0.1:9000
    listen = /tmp/php-fpm.sock
    listen.owner = daemon
    listen.group = daemon
    listen.mode = 0666
    user = daemon
    group = daemon
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    pm.max_requests = 500
    pm.status_path = /admin/status.php
    ;security.limit_extensions = .php
    
  3. Apache 설정

    아파치 웹서버의 설정파일은 conf/httpd.conf 이다. 이 파일은 다시 conf/extra/httpd-*.conf 를 삽입하도록 기본 설정되어있다. 대부분의 설정은 기존 버전과도 호환되도록 하고 있다.
    설정 변경 주의
    Apache 2.2 이하버전에서 업그레이드 한다면, 반드시 Upgrading to 2.4 from 2.2 을 읽어보자. 상당히 많이 바뀌었다.
    아래 설정은 위에서 설치한 FPM방식의 PHP와의 연동을 위한 설정이다.
    root@wl ~ # mkdir /usr/local/apache2/fcgi-bin 1)
    root@wl ~ # vi /usr/local/apache2/conf/httpd.conf
    Protocols h2 http/1.1
    ...
    # PHP-FPM via FastCGI Support Configuration Start
    LoadModule fastcgi_module     modules/mod_fastcgi.so 2)
    <IfModule mod_fastcgi.c> 3)
    #	FastCGIExternalServer /usr/local/apache2/fcgi-bin/php-fpm -host 127.0.0.1:9000 -flush -pass-header Authorization
    	FastCGIExternalServer /usr/local/apache2/fcgi-bin/php-fpm -socket /tmp/php-fpm.sock -flush -pass-header Authorization
    	AddHandler php5-fcgi php
    	Action php5-fcgi /fcgi-bin/php-fpm
    	Alias /fcgi-bin/ /usr/local/apache2/fcgi-bin/
    	<Location /fcgi-bin/>
    		Require all granted
    		Options ExecCGI
    		SetHandler php5-fcgi
    	</Location>
    </IfModule>
    # PHP-FPM via FastCGI Support Configuration End
    
    ServerAdmin admin@solanara.net 4)
    ServerName www.solanara.net:80 4)
    
    #Include conf/extra/httpd-mpm.conf
    #Include conf/extra/httpd-multilang-errordoc.conf
    #Include conf/extra/httpd-autoindex.conf
    #Include conf/extra/httpd-languages.conf
    #Include conf/extra/httpd-userdir.conf
    #Include conf/extra/httpd-info.conf
    #Include conf/extra/httpd-vhosts.conf
    #Include conf/extra/httpd-manual.conf
    #Include conf/extra/httpd-dav.conf
    Include conf/extra/httpd-default.conf 6)
    #Include conf/extra/httpd-ssl.conf 5)
    
    1) mod_fastcgi 와 관련해 fcgi-bin 디렉토리를 만든다.
    2) mod_fastcgi 모듈을 추가한다.
    3) PHP사용을 위해, mod_fastcgi 설정을 추가한다.
    4) ServerAdmin(서버 관리자의 메일 주소)과 ServerName을 정해준다. 정하지 않아도 되지만 아파치 시작시 httpd: Could not determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName와 같은 메시지가 나올 수 있다. 만약 도메인이 없다면 IP를 입력해준다. 예) ServerName 192.168.0.1
    5) 각종 삽입 파일 지시자의 주석을 풀어 사용 하도록 한다. 기본값을 그대로 사용하겠다면 주석을 풀지 않아도 된다. 하지만 conf/extra/httpd-default.conf에 나와있는 ServerTokens ProdServerSignature Off설정은 꼭 넣자.
    6) 솔라나라에 나와있는 대로 libnghttp2 와 같이 Apache를 컴파일 하면 HTTP/2 를 사용할 수 있다. https 프로토콜에서 HTTP/2 를 사용하려면, Protocols h2 http/1.1를 VirtualHost 태그 안에 추가해주면 된다. 자세한 사항은 HTTP/2 guide

Apache, PHP 실행

  1. 시작/정지

    Apache와 PHP-FPM 을 시작한다.
    root@wl ~ # /etc/init.d/php-fpm start
    root@wl ~ # /usr/local/apache2/bin/apachectl start
    
    종료는 아래와 같이 할 수 있다.
    root@wl ~ # /usr/local/apache2/bin/apachectl stop
    root@wl ~ # /etc/init.d/php-fpm stop
    
  2. 테스트

    AMP 스택이 잘 설치되었는지 확인하는 가장 좋은 방법은 PHP의 phpinfo()를 호출해 결과를 보는 것이다. 아래와 같이 .php 파일을 작성하자.

    root@wl ~ # vi /usr/local/apache2/htdocs/phpinfo.php
    <?php
      phpinfo();
    ?>
    root@wl ~ #
    

    웹 브라우저를 사용해 http://localhost/phpinfo.php 에 접속해본다. php 정보가 제대로 나오는지 확인한다. 아래와 비슷하게 나와야 한다. (특히 4월 1일에 보면 PHP 로고가 다르게 보인다) 확인되었으면 phpinfo.php파일을 지운다.

    PHP정보
    root@wl ~ # rm /usr/local/apache2/htdocs/phpinfo.php
    

그 외의 할일들

RSS ATOM XHTML 1.0 CSS3