AMP - 윈디하나의 솔라나라
|
/usr/local
에 설치한다. 본 내용대로 하기 위해 솔라리스에 이미 설치되어있는 APM을 삭제해야할 필요는 없다.# 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 를 컴파일하기 위해 필요한 라이브러리다.
# 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 install1) GNUAwk 4.x 가 필요하다.
/usr/include/sys/param.h
에 MIN, MAX 매크로가 있지만 솔라리스에는 없다. 매크로를 추가해준다.
# 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에 라인 편집 기능이 필요하지 않다면 이 줄을 제외하고 빌드 해도 된다.# 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
# 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"
를 사용하자.
configure
전에 include/config/ftoption.h
의 FT_CONFIG_OPTION_SUBPIXEL_RENDERING
을 언코멘트 하면 서브픽셀렌더링을 사용할 수 있지만, 기본적으로 비활성화되어있다. 마이크로소프트의 특허때문이다. FreeType & Patents를 읽어보자."/usr/local/include/ft2build.h", line 56: cannot find include file: <freetype/config/ftheader.h>와 유사한 오류가 나면
/usr/local/include/ft2build.h
파일을 지운다. 이 파일은 더이상 사용되지 않으며 /usr/local/include/freetype2/ft2build.h
으로 대체되었다.# 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
# 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 install1)
--enable-nonportable-atomics
옵션은 이식 가능하지 않은 (운영체제에 특화된) Atomic operations 을 사용하라는 의미다. 사용하는 컴파일러에 따라 작동 방식이 다르다. GCC 4.1 이상에서는 __sync_val_compare_and_swap
빌트인 함수를 사용하며, GCC를 사용하지 않는 솔라리스에서는 atomic_cas_ptr(3C)와 atomic_swap_ptr(3C)를 사용한다./usr/local
에 설치된다.CFLAGS="-m64"
를 사용하자.
# 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 install1) 7.43.0 이후 버전부터 nghttp2 라이브러리와 같이 설치하면 HTTP/2를 지원한다.
--with-ca-bundle=/usr/local/ssl/certs/ca-bundle.crt
을 붙여 컴파일해 번들 인증서를 사용할 수 있다.mysqlnd
를 사용해 PHP를 설치한다. 따라서 PHP와 MySQL 연동을 위해 MySQL을 설치할 필요는 없다. (MySQL 서버나 MySQL 클라이언트가 필요하지 않다면 MySQL을 설치하지 않아도 된다)공식홈페이지: 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 install1) 모든(all) 모듈을 정적 컴파일 하며, MPM을
event
, prefork
, worker
중 선택 가능하도록 컴파일하며 솔라리스에서는 기본으로 event
를 사용한다. --enable-mods-static=all
대신 --enable-mods-static=reallyall
을 사용하면 정말 모든 모듈을 설치하지만 이 옵션은 추천하지 않는다.CFLAGS="-m64" LDFLAGS="-m64"
를 추가한다.acme.sh를 사용해 설정하는데 acme.sh 와 mod_md 가 서로 호환되질 않아 acme.sh 사용시 오류가 발생한다. 따라서 솔라나라에서는 mod_md 를 비활성화 한다.
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
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
캐시를 사용하는데, 캐시 처리는 웹서버로부터 전달해오는 캐시 정보를 기준으로 작동한다. 웹서버에서 설정하는 캐시 정보는 시스템의 시각에 따라 설정된다. 따라서 브라우저의 캐시가 올바르게 작동하려면, 시스템의 시각이 정확해야 하며, 타임 존 설정이 정확해야 한다. 시스템 시계를 정확히 맞추는 방법은 윈디하나의 솔라나라: NTP를 읽어보자.
대한민국의 법률에 정하는 바에 따라 웹 서버의 로그를 저장해 놓아야 한다. 로그 해야할 내용은 접속 기록
이다. 어느 IP
에서 언제
접속했는지만 알면 된다. URL 및 내용에 대한 로깅의 법률적 의무는 없는 것으로 알고 있다. (URL이나 내용을 로깅하는건 위험하기도 하다. 개인정보가 될 수 있기 때문이다) 로그의 보관기간은 개인정보보호법, 정보통신망법, 신용정보법, 전자금융거래법 등의 영향을 받는데 보통 6개월이다. (필자는 법률 전문가가 아니므로 자세한 설명은 피하겠다. 필요하다면 법률 자문을 받자)
따라서 6개월치 로그를 저장할 저장장치의 용량을 반드시 확보해 놓아야 한다. 필자가 이런 내용을 써 놓는 이유가, 성능 안나온다고, 디스크 용량이 부족하다는 이유로 로그를 꺼놓고 운영하는 경우를 많이 봐왔기 때문이다. 법률로 로깅하도록 정해져 있는거니 로그 끄지 말고 필요하다면 웹서버 증설하자. 쉽게 말하면 아파치 웹서버의 접속 로그를 6개월치 보관할 수 있도록 디스크 용량을 확보하자라는 의미다.
이런 이유 말고도 로그를 저장해 놔야 하는이유는 더 있다. 이슈 해결이다. 누가 언제 어느 URL에 접속한걸 조사해야 할 일이 시스템을 운영하다보면 반드시 발생한다.
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
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.crtPHP-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
아파치 웹서버의 설정파일은 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
디렉토리를 만든다.mod_fastcgi
모듈을 추가한다.mod_fastcgi
설정을 추가한다.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
conf/extra/httpd-default.conf
에 나와있는 ServerTokens Prod
와 ServerSignature Off
설정은 꼭 넣자.Protocols h2 http/1.1
를 VirtualHost 태그 안에 추가해주면 된다. 자세한 사항은 HTTP/2 guide를 읽어보자.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
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파일을 지운다.
root@wl ~ # rm /usr/local/apache2/htdocs/phpinfo.php
RSS ATOM XHTML 5 CSS3 |
Copyright © 2004-2023 Jo HoSeok. All rights reserved. |