AMP - 윈디하나의 솔라나라

목차

개요

요구 라이브러리 설치

  1. OpenSSL: 윈디하나의 솔라나라: OpenSSL 를 참고해 OpenSSL 라이브러리를 설치하자. https 를 지원하기 위함이다.
  2. nghttp2

    # wget https://github.com/nghttp2/nghttp2/releases/download/v1.44.0/nghttp2-1.44.0.tar.xz
    # tar xvfJ nghttp2-1.44.0.tar.xz
    # cd nghttp2-1.44.0
    # vi configure
           PTHREAD_LDFLAGS="-lpthread" # 19080 라인
    # ./configure CFLAGS="-m64" CXXFLAGS="-m64" \
      OPENSSL_CFLAGS="-I/usr/local/ssl/include" \
      OPENSSL_LIBS="-L/usr/local/ssl/lib -lssl -lcrypto" \
      --disable-examples \
      --disable-python-bindings
    # make
    # make install
    

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

  3. libedit

    # wget http://thrysoee.dk/editline/libedit-20210714-3.1.tar.gz
    # tar xvfz libedit-20210714-3.1.tar.gz
    # cd libedit-20210714-3.1
    # ./configure CFLAGS="-m64"
    # vi src/vis.c 2)
    #define MIN(a,b) (((a)<(b))?(a):(b))
    #define MAX(a,b) (((a)>(b))?(a):(b))
    # make 1)
    # sudo make install
    
    1) GNUAwk 4.x 가 필요하다.
    2) Linux 에는 /usr/include/sys/param.h에 MIN, MAX 매크로가 있지만 솔라리스에는 없다. 매크로를 추가해준다.
  4. Perl Compatible Regular Expressions

    # wget https://ftp.pcre.org/pub/pcre/pcre-8.45.tar.bz2
    # tar xvfj pcre-8.45.tar.bz2
    # cd pcre-8.45
    # ./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 \
      CFLAGS="-m64" LDFLAGS="-m64" CXXFLAGS="-m64" 1)
    # make
    # sudo make install
    
    1) pcretest에 라인 편집 기능이 필요하지 않다면 이 줄을 제외하고 빌드 해도 된다.
  5. zlib

    # wget https://www.zlib.net/zlib-1.2.12.tar.xz
    # tar xvfJ zlib-1.2.12.tar.xz
    # cd zlib-1.2.12
    # ./configure --64
    # make
    # make test
    ...
                    *** zlib test OK ***
    ...
                    *** zlib shared test OK ***
    ...
                    *** zlib 64-bit test OK ***
    # sudo make install
    
  6. Libiconv

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

    # wget https://download.savannah.gnu.org/releases/freetype/freetype-2.11.0.tar.xz
    # tar xvfJ freetype-2.11.0.tar.xz
    # cd freetype-2.11.0
    # ./configure --with-harfbuzz=no CFLAGS="-m64" LDFLAGS="-m64"
    # make
    # sudo make install
    
  8. Apache Portable Runtime

    # wget http://mirror.navercorp.com/apache/apr/apr-1.7.0.tar.bz2
    # tar xvfj apr-1.7.0.tar.bz2
    # cd apr-1.7.0
    # ./configure \
      --enable-nonportable-atomics \
      --enable-threads \
      --enable-posix-shm \
      --enable-allocator-uses-mmap \
      --enable-allocator-guard-pages \
      --enable-pool-concurrency-check \
      --enable-other-child \
      --prefix=/usr/local 1) 3)
    # make
    # make install 2)
    
    # wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.1.tar.bz2
    # tar xvfj apr-util-1.6.1.tar.bz2
    # cd apr-util-1.6.1
    # ./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.se/download/curl-7.78.0.tar.xz
    # tar xvfJ curl-7.78.0.tar.xz
    # cd curl-7.78.0
    # ./configure \
      --without-nss \
      --with-ssl=/usr/local/ssl \
      --with-nghttp2=/usr/local \
      --with-brotli=/usr/local \
      --with-libidn2=/usr/local \
      --with-ca-fallback \
      CPPFLAGS="-I/usr/local/ssl/include -I/usr/local/include" CFLAGS="-m64" LDFLAGS="-L/usr/local/ssl/lib -L/usr/local/lib -R/usr/local/lib -R/usr/local/ssl/lib -m64"
       1) 2)
    ...
      Host setup:       i386-pc-solaris2.11
      Install prefix:   /usr/local
      Compiler:         cc
       CFLAGS:          -m64 -xO2
       CPPFLAGS:        -I/usr/local/ssl/include -I/usr/local/include -I/usr/local/include -I/usr/local/ssl/include -I/usr/local/include -I/usr/local/include
       LDFLAGS:         -L/usr/local/ssl/lib -L/usr/local/lib -R/usr/local/lib -R/usr/local/ssl/lib -m64 -L/usr/local/lib -L/usr/local/ssl/lib -L/usr/local/lib -L/usr/local/lib
       LIBS:            -lnghttp2 -lidn2 -lssl -lcrypto -lssl -lcrypto -lldap -llber -lbrotlidec -lbrotlidec -lz
    
      curl version:     7.78.0
      SSL:              enabled (OpenSSL)
      SSH:              no      (--with-{libssh,libssh2})
      zlib:             enabled
      brotli:           enabled (libbrotlidec)
      zstd:             no      (--with-zstd)
      GSS-API:          no      (--with-gssapi)
      GSASL:            no      (libgsasl not found)
      TLS-SRP:          enabled
      resolver:         POSIX threaded
      IPv6:             enabled
      Unix sockets:     enabled
      IDN:              enabled (libidn2)
      Build libcurl:    Shared=yes, Static=yes
      Built-in manual:  enabled
      --libcurl option: enabled (--disable-libcurl-option)
      Verbose errors:   enabled (--disable-verbose)
      Code coverage:    disabled
      SSPI:             no      (--enable-sspi)
      ca cert bundle:   no
      ca cert path:     no
      ca fallback:      yes
      LDAP:             enabled (OpenLDAP)
      LDAPS:            enabled
      RTSP:             enabled
      RTMP:             no      (--with-librtmp)
      PSL:              no      (libpsl not found)
      Alt-svc:          enabled (--disable-alt-svc)
      HSTS:             enabled (--disable-hsts)
      HTTP1:            enabled (internal)
      HTTP2:            enabled (nghttp2)
      HTTP3:            no      (--with-ngtcp2, --with-quiche)
      ECH:              no      (--enable-ech)
      Protocols:        DICT FILE FTP FTPS GOPHER GOPHERS HTTP HTTPS IMAP IMAPS LDAP LDAPS MQTT POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP
      Features:         AsynchDNS HSTS HTTP2 HTTPS-proxy IDN IPv6 Largefile NTLM NTLM_WB SSL TLS-SRP UnixSockets alt-svc brotli libz
    # make
    # sudo make install
    
    1) 7.43.0 이후 버전부터 nghttp2 라이브러리와 같이 설치하면 HTTP/2를 지원한다.
    2) 윈디하나의 솔라나라: OpenSSL - CA 번들 인증서을 설치했다면, --with-ca-bundle=/usr/local/ssl/certs/ca-bundle.crt을 붙여 컴파일해 번들 인증서를 사용할 수 있다.

Apache, PHP 설치

  1. MySQL

  2. The Apache HTTP Server

    공식홈페이지: The Apache HTTP Server Project

    아파치에 대한 더 자세한 설명은 윈디하나의 솔라나라: 아파치 웹 서버 (작성중)를 읽어보자.

    windy@wl ~/src $ wget http://apache.tt.co.kr//httpd/httpd-2.4.48.tar.bz2
    windy@wl ~/src $ wget https://github.com/FastCGI-Archives/mod_fastcgi/archive/2.4.7.1.tar.gz
    windy@wl ~/src $ tar xvfj httpd-2.4.48.tar.bz2
    windy@wl ~/src $ tar xvfz mod_fastcgi-2.4.7.1.tar.gz
    windy@wl ~/src $ cd httpd-2.4.48
    windy@wl ~/src/httpd-2.4.48 $ ./configure \
      --prefix=/usr/local/apache2 \
      --enable-so \
      --enable-mods-static=all \
      --enable-proxy-http2 \
      --enable-proxy-fcgi \
      --enable-brotli \
      --disable-md \
      --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 \
      --with-brotli=/usr/local \
      --enable-mpms-shared='event prefork worker' 1) 2) 3)
    windy@wl ~/src/httpd-2.4.48 $ make
    windy@wl ~/src/httpd-2.4.48 $ sudo make install
    windy@wl ~/src/httpd-2.4.48 $ cd ../mod_fastcgi-2.4.7.1
    windy@wl ~/src/mod_fastcgi-2.4.7.1 $ cp Makefile.AP2 Makefile
    windy@wl ~/src/mod_fastcgi-2.4.7.1 $ make
    windy@wl ~/src/mod_fastcgi-2.4.7.1 $ sudo make install
    
    1) 모든(all) 모듈을 정적 컴파일 하며, MPM을 event, prefork, worker중 선택 가능하도록 컴파일하며 솔라리스에서는 기본으로 event를 사용한다. --enable-mods-static=all 대신 --enable-mods-static=reallyall을 사용하면 정말 모든 모듈을 설치하지만 이 옵션은 추천하지 않는다.
    2) 64bit 로 컴파일하려면 CFLAGS="-m64" LDFLAGS="-m64"를 추가한다.
    3) Apache Module mod_md 는 ACME 프로토콜을 지원하기 위한 모듈로, ACME 를 지원하는 인증서 발급기관을 사용하는 경우 인증서를 자동으로 관리해준다. 솔라나라에서는 윈디하나의 솔라나라: Let’s Encrypt 문서에서와 같이 acme.sh를 사용해 설정하는데 acme.sh 와 mod_md 가 서로 호환되질 않아 acme.sh 사용시 오류가 발생한다. 따라서 솔라나라에서는 mod_md 를 비활성화 한다.
  3. PHP: Hypertext Preprocessor

    PHP를 빌드한 후 설치하자. PHP에 대한 더 자세한 설명을 보려면 윈디하나의 솔라나라: PHP을 읽어보자.
    windy@wl ~/src $ wget https://www.php.net/distributions/php-7.4.30.tar.xz
    windy@wl ~/src $ digest -a sha256 php-7.4.30.tar.xz
    ea72a34f32c67e79ac2da7dfe96177f3c451c3eefae5810ba13312ed398ba70d
    windy@wl ~/src $ tar xvfJ php-7.4.30.tar.xz
    windy@wl ~/src $ cd php-7.4.30
    windy@wl ~/src/php-7.4.30 $ ./configure \
      --prefix=/usr/local/php74 \
      --with-mysqli=mysqlnd \
      --with-pdo-mysql=mysqlnd \
      --with-pdo-sqlite=/usr/local \
      --with-iconv=/usr/local \
      --enable-gd \
      --with-jpeg \
      --with-freetype \
      --with-zlib-dir=/usr/local \
      --with-openssl=/usr/local/ssl \
      --with-openssl-dir=/usr/local/ssl \
      --with-sqlite3=/usr/local \
      --with-xsl \
      --enable-fpm \
      --enable-calendar \
      --with-curl=/usr/local \
      --enable-mbstring \
      --enable-mbregex \
      --enable-mysqlnd \
      --enable-sigchild \
      --enable-pcntl \
      --enable-sysvmsg \
      --enable-sysvsem \
      --enable-sysvshm \
      --enable-sockets \
      --enable-soap \
      --enable-ftp \
      --enable-exif \
      --enable-bcmath \
      --with-zip \
      --with-zlib \
      --with-external-pcre \
      --with-pcre-jit \
      --enable-opcache \
      --enable-maintainer-zts \
      --with-tsrm-pthreads \
      CFLAGS="-m64 -L/usr/local/lib -L/usr/local/ssl/lib -R/usr/local/lib -R/usr/local/ssl/lib" \
      CPPFLAGS="-I/usr/local/ssl/include -I/usr/local/include" LDFLAGS=-m64 CXXFLAGS=-m64 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig \
      CC="gcc" CXX="g++"
    windy@wl ~/src/php-7.4.30 $ make
    windy@wl ~/src/php-7.4.30 $ sudo make install
    windy@wl ~/src/php-7.4.30 $ cd /usr/local; sudo ln -s php74 php; cd -
    windy@wl ~/src/php-7.4.30 $ sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
    windy@wl ~/src/php-7.4.30 $ sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    windy@wl ~/src/php-7.4.30 $ sudo chmod +x /etc/init.d/php-fpm
    windy@wl ~/src/php-7.4.30 $ sudo vi /etc/init.d/php-fpm
    #!/bin/bash
    windy@wl ~/src/php-7.4.30 $ sudo cp php.ini-* /usr/local/php/lib/
    windy@wl ~/src/php-7.4.30 $ sudo cp php.ini-development /usr/local/php/lib/php.ini 1)
    
    1) 개발시에는 php.ini-development파일을 기반으로 설정하지만, 서비스시에는 php.ini-production을 기반으로 설정한다.
    --with-apxs2--enable-fpm
    이 문서에서는 PHP-FPM을 사용해 설치했다. 하지만 PHP-FPM은 PreFork 방식이라 대용량 웹 서버 운용시 메모리를 많이 소비하는 단점이 있다. 메모리 사용량이 많아 이슈가 되는 경우, apxs 를 사용해 아파치 모듈로 연동하면 메모리 사용량을 많이 줄일 수 있다. configure--enable-fpm을 빼고 아래와 같이 해주면 된다.
    # ./configure \
      --with-apxs2=/usr/local/apache2/bin/apxs \
      ...
    # make
    # make install
    
    설치가 완료된 후 httpd.conf 에 FastCGI 설정(하단의 PHP 설정 단락 참조) 대신 아래와 같이 설정해야 한다.
    LoadModule php5_module        modules/libphp5.so
    AddType application/x-httpd-php	.php
    AddType application/x-httpd-php-source	.phps
    

Apache, PHP 기본 설정

  1. 시스템 설정

    웹 서버 자체의 설정 외에도 시스템이 웹 서비스에 최적화되도록 설정되어야 한다. 아래에 최소한 아래 항목 정도는 설정해놓아야 한다고 생각되는걸 적어 놓았다.
  2. PATH 설정

    apachectl(8) 을 쉽게 실행하기 위해 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
    
  3. PHP, PHP-FPM 설정

    PHP 설정은 php.ini에서 한다. 기본적으로 타임존을 설정해야 하며, PHP 라이브러리를 읽을 디렉토리를 정하는 include지시자와 확장 라이브러리 디렉토리 경로를 지정해야 한다. 또한 대용량 파일 업로드 기능을 사용하려면, 최대 전송 가능한 크기를 지정해야 한다.
    windy@wl ~ $ sudo 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/php74/lib/php/extensions/no-debug-zts-20190902"
    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 ~ # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/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
    user = daemon
    group = daemon
    ;listen = 127.0.0.1:9000
    listen = /tmp/php-fpm.sock
    listen.owner = daemon
    listen.group = daemon
    listen.mode = 0666
    
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    ;pm.process_idle_timeout = 10s;
    pm.max_requests = 500
    pm.status_path = /admin/status.php
    ;slowlog = log/$pool.log.slow
    ;security.limit_extensions = .php
    
  4. Apache 설정

    아파치 웹서버의 설정파일은 conf/httpd.conf 이다. 이 파일은 다시 conf/extra/httpd-*.conf 를 삽입하도록 기본 설정되어있다.

    위에서 설치한 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 5)
    #Include conf/extra/httpd-ssl.conf 6)
    
    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, OpenSSL 1.1.1 와 같이 빌드 하면 HTTP/2 및 TLS 1.3 을 사용할 수 있다. 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. 테스트

    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 5 CSS3