Special:Communication & Concept/FreeBSD 11.2에서 Nginx, Mysql, PHP, phpMyAdmin 를 설치하기위한 방법.(How to Install Nginx , Mysql, PHP, phpMyAdmin on FreeBSD 11.2)

Jump to: navigation, search
#170 [ Ssam ] hit: 122(#85ff85) 2

Template:Quotation

FreeBSD 포트 컬렉션 설치와 업데이트

  • 위에서 실행하지 않았다면 실행
# portsnap fetch
# portsnap extract
# portsnap fetch update
  • FreeBSD 패키지 업데이트 와 업그레이드
# pkg update
# pkg upgrade


FreeBSD에 웹서버 엔진엑스 설치(Install Nginx Web Server on FreeBSD)

  • nginx 설치 명령어
# pkg install nginx
  • 에디터로 vi /etc/rc.conf 파일을 열어 sysrc nginx_enable="yes"을 추가해도 되고, 아래 명령으로 추가해도 된다.
# sysrc nginx_enable="yes"
  • 웹서버 엔진엑스(nginx) 시작
# service nginx start
  • 웹서버 엔진엑스(nginx) 버전 확인
# nginx -V
메세지 출력
nginx version
nginx/1.14.X
built with OpenSSL 1.0.2k-freebsd 26 Jan 2017 (running with OpenSSL 1.0.2p-freebsd 14 Aug 2018)
TLS SNI support enabled
[.....]
멀티 인증서(SNI) 구성 가능.....

MariaDB 설치(Install MariaDB on FreeBSD)

  • 데이터 베이스는 개인 취향에 맞는거로 1개만 설치하면 된다.
  • 최신 버전을 설치하기 위해서 설치 전 검색
# pkg search maria
메세지 출력 최신 버전 클라이언트 서버
[......]
mariadb100-client-10.0.36_1 Multithreaded SQL database (client)
mariadb100-server-10.0.36_1 Multithreaded SQL database (server)
mariadb101-client-10.1.35_1 Multithreaded SQL database (client)
mariadb101-server-10.1.35_1 Multithreaded SQL database (server)
mariadb102-client-10.2.17 Multithreaded SQL database (client)
mariadb102-server-10.2.17 Multithreaded SQL database (server)
mariadb103-client-10.3.8 Multithreaded SQL database (client)
mariadb103-server-10.3.8_2 Multithreaded SQL database (server)
[.......]


  • 여기서는 mariadb102를 설치 한다.
# pkg install mariadb102-server
메세지 출력

[............................]

Proceed with this action? [y/N]: y
메세지에 디비 설정 관련 메세지가 출력된다.
  • db설정 파일 만들기 /usr/local/share/mysql/my-medium.cnf 샘플 파일을 /usr/local/etc/my.cnf 파일로 복사하여 만든다.
  • db 샘플 파일은 /usr/local/share/mysql/ 디렉토리에 여러개(my-innodb-heavy-4G.cnf, my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf, 이중에서 선택하면 된다.)
서버 메모리에 따라 선택 한다.
  1. my-innodb-heavy-4G.cnf: 4G (innodb 사용)
  2. my-huge.cnf: 1~2G
  3. my-large.cnf 512M
  • MariaDB 설정 파일 my.cnf를 /usr/local/etc/ 이 디렉토리로 복사한다.
# cp /usr/local/share/mysql/my-innodb-heavy-4G.cnf /usr/local/etc/my.cnf
  • 에디터 vi /etc/rc.conf 파일을 열어 mysql_enable="yes"을 추가해도 되고, 아래 명령으로 추가해도 된다.
# sysrc mysql_enable=yes
  • db 서버 시작
# service mysql-server start
  • mysql 암호 설정
# mysql_secure_installation
메세지 출력
Enter current password for root (enter for none): 현재 암호 공백이므로 그냥 엔터
Set root password? -> y
New password: 루트 암호
Re-enter new password: 다시 한번 루트 암호
Remove anonymous users? -> y
Disallow root login remotely? -> y
Remove test database and access to it? -> y
Reload privilege tables now? -> y
  • db 서버 재시작
# service mysql-server restart

FreeBSD에 php 설치(Install PHP on FreeBSD)

  • php 최신 패키지 찾기
# pkg search php
메세지 출력
[...............]
php72-7.2.10 PHP Scripting Language
php72-Ice37-3.7.1 Modern alternative to object middleware such as CORBA/COM/DCOM/COM+
php72-aphpbreakdown-2.2.2 Code-Analyzer for PHP for Compatibility Check-UP
php72-aphpunit-1.6 Testing framework for unit tests
php72-bcmath-7.2.10 The bcmath shared extension for php
php72-bsdconv-11.5.0 PHP wrapper for bsdconv
[................]


  • mediawiki를 설치 할 예정 이므로 관련된 확장 모듈 설치.(mediawiki, 기타, 설치를 위한 모듈, 캐쉬 부분...)
  • mediawiki1.31.x 설치시 요구사항
ctype, iconv, json, mbstring, xml, 캐쉬확장(php72-pecl-APCu) 선택사항, 기타
  • 필요한 것 확인 후 추가 한다.
# pkg install php72 php72-mysqli php72-mbstring php72-gd php72-curl php72-json php72-zip php72-imap php72-iconv php72-xml php72-sockets php72-openssl php72-session php72-hash php72-ctype php72-xmlwriter php72-xmlreader php72-dom php72-simplexml php72-posix php72-tokenizer php72-fileinfo php72-pecl-APCu
  • php.ini-production 파일을 /usr/local/etc/ 디렉토리에 복사 한다.
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
  • 에디터 vi /etc/rc.conf 파일을 열어 php-fpm_enable="yes"을 추가해도 되고, 아래 명령으로 추가해도 된다.
# sysrc php_fpm_enable=yes
  • php-fpm 스크립트 서비스 시작
# service php-fpm start

PHP-FPM 스크립트 환경 설정(Configuring PHP-FPM)

  • 통신용 네트워크 포트 대신 Unix 소켓을 사용하도록 PHP-FPM을 구성한다.
  • 설정 파일 vi /usr/local/etc/php-fpm.d/www.conf 파일을 열어 수정, 추가 해 준다.
  • 36라인 쯤에 주석 처리하고 바로 아래에 listen = /var/run/php-fpm.sock 를 추가 한다.
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
  • 48,49,50 라인에 주석 제거
listen.owner = www
listen.group = www
listen.mode = 0660
  • php-fpm 서비스 재시작
# service php-fpm restart

PHP-FPM으로 엔진엑스 환경 설정(Configuring Nginx with PHP-FPM)

  • 엔진엑스 환경 설정시 반드시 참고.
  1. 참고1 www.nginx.com 사이트, 설정 예를 보여 주며 설정 방법을 제시하는 곳.
  2. 참고2 www.nginx.com사이트, 여러 가기지의 예를 들어 제시되어 있다. 참고하여 설정
에디터 vi /usr/local/etc/nginx/nginx.conf 엔진엑스 환경 설정 파일을 열어 수정 한다.
# vi /usr/local/etc/nginx/nginx.conf
  • 아래와 같이 수정 한다.

user  www www;
worker_processes  2; 
error_log /var/log/nginx/error.log info;

events {
    worker_connections  4096;
}

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

    access_log /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        listen [::]:80;

        server_name 192.168.0.35;

        root /usr/local/www/nginx;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
    }
}


  • 엔진엑스 재시작
# service nginx restart
  • 에디터 vi /usr/local/www/nginx/info.php 아래와 같이 작성한다.
<?php
 phpinfo(); 
  • 웹브라우저 주소창에 아래 주소를 넣고 확인 해 본다.
http://192.168.0.35/info.php
php 정보 확인 후 제거한다.(사설 아이피에서만 접속 가능하게 하면 그냥 놔 두어도 괜!)
# rm -f /usr/local/www/nginx/info.php

php 환경설정

  • 클라우드 설치 대비, upload_max_filesize 1000M, post_max_size 1001M, max_execution_time, max_input_time는 10배로, memory_limit는 2배로
  • 이 파일 vi /usr/local/etc/php.ini 을 열어 수정 한다.
383라인쯤에 주석 해제
max_execution_time = 300
393라인쯤에
max_input_time = 600
404라인쯤에
memory_limit = 256M
672라인쯤에
post_max_size = 1001M
825라인쯤에
upload_max_filesize = 1000M
이 부분을 찾아서 적당한 크기로 수정 해 준다.
  • 835 라인쯤에 (off 로 설정 한다. php.net 웹사이트 참고)
allow_url_fopen = off
  • php-fpm 서비스 재시작
# service php-fpm reload
  • 엔진엑스 재시작
# service nginx reload


phpMyAdmin 설치

  • make clean 은 이전 컴파일 내용을 삭제, make distclean 은 파일을 받고 압축을 푼 처음 상태로 만드는 것.
  • 현재 포트 컴파일 phpMyAdmin 패기지는 4.8.3.버전이 설치된다.
# cd /usr/ports/databases/phpmyadmin && make config-recursive install distclean


모두 설치된 다음 메세지 출력, Apache version 2.4 상위 버전은 아래 와 같이 추가 하라고 나온다.
For Apache version 2.4.x or above:
Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"

    <Directory "/usr/local/www/phpMyAdmin/">
        Options None
        AllowOverride Limit

        Require local
        Require host .example.com
    </Directory>


  • nginx 웹서버 설정 이므로 무시한다.
  • phpMyAdmin은 이 위치 /usr/local/www/phpMyAdmin/ 에 설치가 된다.
  • config.inc.php 복사
# cp /usr/local/www/phpMyAdmin/config.sample.inc.php /usr/local/www/phpMyAdmin/config.inc.php
  • 심볼 링크로 /usr/local/www/nginx/phpmyadmin 웹루트 디렉토리에 링크를 건다.
# ln -s /usr/local/www/phpMyAdmin/ /usr/local/www/nginx/phpmyadmin
  • 엔진엑스(nginx) 다시 로딩
# service nginx reload
  • 웹브라우저 주소창에 아래 주소넣고 확인 해 본다.
http://192.168.0.35/phpmyadmin

phpMyAdmin 에 config.inc.php 설정

  • 로그인 하면 하단에 Template:Code항목이 뜬다. 적당히 넣어 주면 된다.
이 파일 vi /usr/local/www/phpMyAdmin/config.inc.php 을 열어 넣어 주면 된다.
17라인에
$cfg['blowfish_secret'] = '암호(@_@)6/3=2를-적어*놓으시오_쿠키에-필요=하다고^하니!'; 


openssl dhparam 인증서 설치

  • 한 개로 모든 사이이트에 적용 가능, 디피-헬먼 키 교환(Diffie–Hellman key exchange), 위키백과 참고
  • dhparam 인증서 /usr/local/etc/nginx/ssl 디렉토리 만들기
# mkdir /usr/local/etc/nginx/ssl
  • openssl dhparam 인증서 생성 약 10분 정도?
# openssl dhparam -out /usr/local/etc/nginx/ssl/dhparam.pem 4096
  • 퍼미션 조정
# chmod -R 600 /usr/local/etc/nginx/ssl


엔진엑스(nginx) 호스트 설정

  1. 가상호스트 파일 분리 전 참고 사항.
  2. 메인 웹 루트는 /usr/local/www/nginx/ 여기 이지만 사용하지 않는다.
  3. 사용자 계정 /usr/home/*/www/html/ 계정을 사용하려고 설정 함.
  4. 웹서버에 미디어위키를 설치하기 위하여, nginx.com 사이트를 참고 한다.
  5. 엔진엑스 vi /usr/local/etc/nginx/nginx.conf 환경 설정 파일을 열어 수정 한다.


user  www www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  4096;
}

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

    access_log /var/log/nginx/access.log;

    server_tokens off;

    sendfile        on;

    # keepalive_timeout  65;

    server {
        listen 80;
        listen [::]:80;

        server_name 192.168.0.35;

        root /usr/local/www/nginx;
        index index.php index.html index.htm;

        # upload size
        client_max_body_size 1001m;
        client_body_timeout 600;

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
    }

    #mysam
    server {
        listen 80;
        listen [::]:80;
        server_name mysam.net *.mysam.net;
        return 301 https://mysam.net$request_uri;
    }

    # mysam
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name  mysam.net *.mysam.net;

        #Let's Encrypt add
        ssl_certificate "/usr/local/etc/letsencrypt/live/mysam.net-00011/fullchain.pem";
        ssl_certificate_key "/usr/local/etc/letsencrypt/live/mysam.net-00011/privkey.pem";
        ssl_trusted_certificate /usr/local/etc/letsencrypt/live/mysam.net-00011/chain.pem;

        #protocols        
        ssl_protocols TLSv1.2 TLSv1.3;         # 프로토콜 점수 100점 준다.(TLSv1.3 아직 지원 안됨.)

        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        
        #ciphers
        ssl_prefer_server_ciphers on;
        # ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;    # dhparam, ... 기타 와 함께 암호강도 점수 100점 준다.(256 암호화 무거운 것)
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';    # 90점 준다.(128 암호화 가벼운 것)

        #OCSP Stapling
        ssl_stapling on;
        ssl_stapling_verify on;
        
        #dhparam 4096
        ssl_dhparam ssl/dhparam.pem;
        ssl_ecdh_curve secp384r1;

        resolver 8.8.8.8 8.8.4.4;
        resolver_timeout 5s;

        # Security
        add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";     # 초당 6개월 이상이면 100점 준다.
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        root /usr/home/사용자/www/html;
        index index.php index.html;
        
        # upload size
        client_max_body_size 5m;
        client_body_timeout 65;

        location / {
                try_files $uri $uri/ @rewrite;
        }

        location @rewrite {
                rewrite ^/(.*)$ /wiki/index.php?title=$1&$args;
        }

        location ^~ /maintenance/ {
                return 403;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                try_files $uri /wiki/index.php;
                expires max;
                log_not_found off;
        }

        location = /_.gif {
                expires max;
                empty_gif;
        }

        location ^~ /wiki/cache/ {
                deny all;
        }

        location /dumps {
                root /usr/home/사용자/www/html/wiki/local;
                autoindex on;
        }

    }

}

  • 엔진엑스(nginx) 다시 로딩
# service nginx reload
  • nginx.conf 환경 설정 파일에 대하여
  1. 이부분 user www www; 로 설정 했다. www사용자 www사용자그룹, FreeBSD는 www, 데비안계열 www-data, 기타.
  2. worker_processes 2; 코어가 두개 이므로 2로 설정 했다.
  3. server_tokens off nginx 버전 안 나오게 설정 했다. (버전까지 없게 만들면서 보안에 그렇게 자신이 없나? 그래서 설정 했다.)
  4. 이 아이피는 192.168.0.35 외부접속이 안되므로 phpMyAdmin 접속시 사용 용도.
  5. upload size 조절 로컬이라 크게, 크기 client_max_body_size 1001M;, 대기 시간 client_body_timeout 600; 업로드 사이즈 조절 했다.
  6. mysam.net에 80포트는 인증서 사용 할 것이므로 443포트로 넘긴다.
  7. 443포트에 listen 443 ssl http2http2 지원 하기위해 추가 했다.
  8. 보안 인증서 Let's Encrypt를 추가 했다.
  9. 보안 이슈가 있는 ssl_protocols TLSv1 TLSv1.1; 은 제거 했다.(현재 2018-09-30, 아주 구형 부라우저 이 외에는 에러 없음), protocols 점수 100 주네요^^
  10. 현재 TLSv1.3; 은 아직 지원되지 않지만 앞으로... 그래서 넣었다.
  11. OCSP Stapling (인증서가 유효하다는 증명을 미리 받아두어서 사이트에 처음 방문할 때 사이트 접속 속도를 높여 주는 방법.)을 추가 했다.
  12. nginx에서 추천하는 안내 문서로 추가 했다.
  13. 파일이 길어져서 인크르드(include)를 이용해 파일을 분리 한다.(아래)


가상 호스트 파일 분리(Virtual host file separation)

  1. default(192.168.0.35)는 분리하여 phpMyAdmin으로 사용 할 것.
  2. TLS SNI 지원된다고 하니 2개의 인증서를 각각 사용 할 것.
  3. /usr/local/etc/nginx/ 이 디렉토리에 sites-available, sites-enabled, 을 만들고 sites-enabled심볼링크 파일 만 들어있게 구성.
  4. sites-available 디렉토리 안에 각 사이트 server 블록을 만들고 포함시킬 snippets 디렉토리를 만들어 각 공통으로 들어갈 파일을 만들고 포함 시킬 것.


가상호스트 화일 분리 디렉토리 구조는 이런 형태(우분투 스타일 구조? 잘 보아야 됨)로....
  • 심볼 링크 파일들 부분
/usr/local/etc/nginx/sites-enabled/default
/usr/local/etc/nginx/sites-enabled/mysam.net
/usr/local/etc/nginx/sites-enabled/zbm.kr
  • 실제 파일들 설정 부분
/usr/local/etc/nginx/sites-available/default.conf
/usr/local/etc/nginx/sites-available/mysam.net.conf
/usr/local/etc/nginx/sites-available/zbm.kr.conf
  • 각 server 블록에 포함될 각 인증서 사이트 설정 부분
/usr/local/etc/nginx/snippets/ssl-mysam.net.conf
/usr/local/etc/nginx/snippets/ssl-zbm.kr.conf
  • 각 server 블록에 포함될 인증서 공통 부분
/usr/local/etc/nginx/snippets/ssl-params.conf


위에 구조로 만들기 위해 디렉토리 만들기.
# mkdir /usr/local/etc/nginx/sites-enabled
# mkdir /usr/local/etc/nginx/sites-available
# mkdir /usr/local/etc/nginx/snippets


default.conf 환경설정 파일 만들기
# vi /usr/local/etc/nginx/sites-available/default.conf
아래 내용을 작성 한다.

#phpMyAdmin
server {
        listen 80;
        listen [::]:80;

        server_name 192.168.0.35;

        root /usr/local/www/nginx;
        index index.php index.html index.htm;

        # file upload, 502 error 
        proxy_buffer_size           128k;
        proxy_buffers               4 256k;
        proxy_busy_buffers_size     256k;
 
        fastcgi_buffering           on;
        fastcgi_buffer_size         16k;
        fastcgi_buffers             16 16k;
 
        fastcgi_connect_timeout     600s;
        fastcgi_send_timeout        600s;
        fastcgi_read_timeout        600s;
       
        # upload size
        client_max_body_size 1001m;
        client_body_timeout 600;

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}


mysam.net.conf 환경설정 파일 만들기
# vi /usr/local/etc/nginx/sites-available/mysam.net.conf
아래 내용을 작성 한다.

# mysam
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name  mysam.net *.mysam.net;

        #SSL include
        include snippets/ssl-mysam.net.conf;
        include snippets/ssl-params.conf;

        root /usr/home/사용자/www/html;
        index index.php index.html;

        # mediawiki file upload, 502 error 
        proxy_buffer_size           128k;
        proxy_buffers               4 256k;
        proxy_busy_buffers_size     256k;
 
        fastcgi_buffering           on;
        fastcgi_buffer_size         16k;
        fastcgi_buffers             16 16k;
 
        fastcgi_connect_timeout     600s;
        fastcgi_send_timeout        600s;
        fastcgi_read_timeout        600s;
       
        # upload size
        client_max_body_size 5m;
        client_body_timeout 65;

        location / {
                try_files $uri $uri/ @rewrite;
        }

        location @rewrite {
                rewrite ^/(.*)$ /wiki/index.php?title=$1&$args;
        }

        location ^~ /maintenance/ {
                return 403;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                try_files $uri /wiki/index.php;
                expires max;
                log_not_found off;
        }

        location = /_.gif {
                expires max;
                empty_gif;
        }

        location ^~ /cache/ {
                deny all;
        }

        location /dumps {
                root /usr/home/사용자/www/html/wiki/local;
                autoindex on;
        }

}

#mysam
server {
        listen 80;
        listen [::]:80;
        server_name mysam.net *.mysam.net;
        return 301 https://mysam.net$request_uri;
}


각 사이트 인증서 /usr/local/etc/nginx/snippets/ssl-mysam.net.conf 파일 만들기.
# vi /usr/local/etc/nginx/snippets/ssl-mysam.net.conf
아래 내용을 작성 한다.
#Let's Encrypt add
ssl_certificate "/usr/local/etc/letsencrypt/live/mysam.net-00011/fullchain.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/mysam.net-00011/privkey.pem";
ssl_trusted_certificate /usr/local/etc/letsencrypt/live/mysam.net-00011/chain.pem;


각 사이트 인증서 공통 부분 /usr/local/etc/nginx/snippets/ssl-params.conf 파일 만들기.
# vi /usr/local/etc/nginx/snippets/ssl-params.conf
아래 내용을 작성 한다.
 #protocols 
 ssl_protocols TLSv1.2 TLSv1.3;

 ssl_session_cache shared:SSL:10m;
 ssl_session_timeout 10m;

 #ciphers
 ssl_prefer_server_ciphers on;
 ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

 #OCSP Stapling
 ssl_stapling on;
 ssl_stapling_verify on;

 #dhparam 4096
 ssl_dhparam ssl/dhparam.pem;
 ssl_ecdh_curve secp384r1;

 resolver 8.8.8.8 8.8.4.4;
 resolver_timeout 5s;

 # Security
 add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
 add_header X-Frame-Options DENY;
 add_header X-Content-Type-Options nosniff;


zbm.kr.conf 환경설정 파일 만들기(같은 미디어 위키를 설치 하기위하여, 다른 환경으로 해도 괜....)
# vi /usr/local/etc/nginx/sites-available/zbm.kr.conf
아래 내용을 작성 한다.

# zbm
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name  zbm.kr *.zbm.kr;

        #ssl include
        include snippets/ssl-zbm.kr.conf;
        include snippets/ssl-params.conf;

        root /usr/home/사용자/www/html;
        index index.php index.html;

        # mediawiki file upload, 502 error 
        proxy_buffer_size           128k;
        proxy_buffers               4 256k;
        proxy_busy_buffers_size     256k;
 
        fastcgi_buffering           on;
        fastcgi_buffer_size         16k;
        fastcgi_buffers             16 16k;
 
        fastcgi_connect_timeout     600s;
        fastcgi_send_timeout        600s;
        fastcgi_read_timeout        600s;

        [......]
        ............

}

#zbm
server {
        listen 80;
        listen [::]:80;
        server_name zbm.kr *.zbm.kr;
        return 301 https://zbm.kr$request_uri;
}


사이트 인증서 /usr/local/etc/nginx/snippets/ssl-zbm.kr.conf 파일 만들기.
# vi /usr/local/etc/nginx/snippets/ssl-zbm.kr.conf
아래 내용을 작성 한다.
#Let's Encrypt add
ssl_certificate "/usr/local/etc/letsencrypt/live/zbm.kr-00011/fullchain.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/zbm.kr-00011/privkey.pem";
ssl_trusted_certificate /usr/local/etc/letsencrypt/live/zbm.kr-00011/chain.pem;
각 사이트 인증서 공통 부분 /usr/local/etc/nginx/snippets/ssl-params.conf 파일(공통이므로)


nginx에 기본 환경 파일 최종 재작성

  • nginx.conf 파일을 열어
# vi /usr/local/etc/nginx/nginx.conf
아래와 같이 수정 한다.

user  www www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  4096;
}

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

    access_log /var/log/nginx/access.log;

    server_tokens    off;
    sendfile    on;
    tcp_nopush    off;
    keepalive_timeout    65;
    keepalive_requests    0;
 
    # vhost include
    # include /usr/local/etc/nginx/conf.d/*.conf;
    include /usr/local/etc/nginx/sites-enabled/*;

}


  • 이 파일 vi /usr/local/etc/nginx/fastcgi_params 을 열어 아래 라인을 추가 한다.
6라인쯤에 추가 해 준다.
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO          $fastcgi_path_info;
이 사이트 www.nginx.com 참조
사이트 활성, 심볼 링크를 걸어 준다.(sites.conf 에서 site로 링크)
# ln -s /usr/local/etc/nginx/sites-available/default.conf /usr/local/etc/nginx/sites-enabled/default
# ln -s /usr/local/etc/nginx/sites-available/mysam.net.conf /usr/local/etc/nginx/sites-enabled/mysam.net
# ln -s /usr/local/etc/nginx/sites-available/zbm.kr.conf /usr/local/etc/nginx/sites-enabled/zbm.kr


  • 엔진엑스 재시작
# service nginx reload


로그 보기

  • 끝 부분만 실시간으로 보여 준다.
에러 로그 보기
# tail -f /var/log/nginx/error.log
엑세스 로그 보기
# tail -f /var/log/nginx/access.log
  • 끝내기
# Ctrl + c


사용자 디렉토리 만들고 퍼미션 조정

  • 사용자가 추가되어있지 않다면 사용자 추가, 여러 사용자를 추가 구성 할 수 있다.
# adduser
  1. 메세지 출력에 대하여
  2. Username은 사용자 계정을 적어다 준다, Full name은 그냥 넘겨도 됨.
  3. Login group is due. Invite due into other groups? [], 물음에 일반 사용자면 엔터, 관리자면 wheel그룹에 가입.
메세지 출력 예 입니다.
 Username: lure
 Full name: 
 Uid (Leave empty for default): 
 Login group [lure]: 
 Login group is lure. Invite lure into other groups? []: wheel
 Login class [default]: 
 Shell (sh csh tcsh nologin) [sh]: 
 Home directory [/home/lure]: 
 Home directory permissions (Leave empty for default): 
 Use password-based authentication? [yes]: 
 Use an empty password? (yes/no) [no]: 
 Use a random password? (yes/no) [no]: 
 Enter password: 
 Enter password again: 
 Lock out the account after creation? [no]: 
 Username   : lure
 Password   : *****
 Full Name  : 
 Uid        : 1002
 Class      : 
 Groups     : lure wheel
 Home       : /home/lure
 Home Mode  : 
 Shell      : /bin/sh
 Locked     : no
 OK? (yes/no): yes
 adduser: INFO: Successfully added (lure) to the user database.
 Add another user? (yes/no): no
 Goodbye!
  • 참고로 사용자 삭제 명령은
# rmuser


  • 디렉토리 만들기
# cd ~
# mkdir /usr/home/ssam/www
# mkdir /usr/home/ssam/www/html
  • 퍼미션 조정
# chmod -R 755 /usr/home/ssam/www/html
  • 그룹 변경: 소유자:소유자 그룹
# chown -R ssam:ssam /usr/home/ssam/www/html
  • 엔진엑스 재시작
# service nginx reload
  • 이제 메인 웹 루트가 변경 됬다. (사용자 계정으로 사용하기 위해서...)
/usr/home/*/www/html
퍼미션 조정하고 웹페이지를 만들어 놓으면 된다, 기본 퍼미션은 755 이다.


미디어위키 설치

미디어위키 다운로드

  • 다운로드된 파일을 계정에 업로드 한다
  • 사용자 계정에서 디렉토리로 이동 후 압축 해제
# cd /usr/home/ssam/www/html
# tar xvzf mediawiki-1.31.x.tar.gz
  • 디렉토리를 wiki로 변경
# mv mediawiki-1.31.x wiki
  • 압축된 파일 삭제
# rm -f mediawiki-1.31.x.tar.gz
  • 그룹 변경: 소유자:소유자 그룹
# chown -R ssam:ssam /usr/home/ssam/www/html/wiki
  • 퍼미션 조정(여기서 -R 옵션은 붙이지 않는다, 파일 퍼미션은 644가 되어야 되므로)
# chmod 755 /usr/home/ssam/www/html/wiki
  • 웹브라우저에서 설치
https://zbm.kr/wiki
미디어위키 설치시 캐쉬를 설정하여 설치 한다, 로딩 속도가 10배는 빨라진다.
캐쉬 설정 방법은 아래 미디어위키 관련글을 참고
  • 미디어위키 설치 후 사용자 조정
  • 파일의 소유자와 그룹을 변경, php스크립트로 특정 디렉토리 또는 파일의 퍼미션을 조정하려면 소유자와 소유그룹을 데비안 계열은 www-data로 변경, FreeBSD 계열은 www로 변경 해야 php 스크립트로 특정 디렉토리를 원하는데로 퍼미션 조정을 할 수 있다.
  • 파일 권한 실행은 모두 제거, 본인 읽고, 쓰기, 모두 실행 제거
# chmod -R a-x+X /usr/home/ssam/www/html/wiki
  • 캐쉬 디렉토리와 파일의 소유자를 변경
# chown -R www:ssam /usr/home/ssam/www/html/wiki/cache
  • 이미지 디렉토리와 파일의 소유자를 변경
# chown -R www:ssam /usr/home/ssam/www/html/wiki/images
참고로 모든 디렉토리의 퍼미션은 755, 모든 파일의 퍼미션은 644 가 되어야 된다.


미디어위키 LocalSettings.php 수정 및 .htaccess 파일을 작성

  • 미디어위키 LocalSettings.php에 /wiki/ 디렉토리에 .htaccess 파일을 작성해 주어야된다..
  • 미디어위키(MediaWiki) 설치는 /wiki/ 디렉토리에 설치
  • /wiki/디렉토리안에 LocalSettings.php파일에서 주소형태가 도메인/wiki/index.php/페이지_제목, 형태가 되도록 Template:Code = Template:Code 추가해 주면된다.
  • LocalSettings.php 파일을 열어 수정
$wgScriptPath = "/wiki";
$wgArticlePath = "$wgScriptPath/$1";
$wgUsePathInfo = true; //주소형태 /index.php/페이지_제목 
//$wgUsePathInfo = false; //주소형태 /index.php?title=페이지_제목
  • /wiki/ 디렉토리에 .htaccess 파일을 작성해 준다.
  • 현재 미디어위키(MediaWiki) mediawiki-1.31.1 버전은 작성하지 않아도 된다.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wiki/index.php/$1 [QSA,L]


SSL 점수 높이는 법

  • protocols 점수 높이려면, 현재(2018년10월) 괜 찬음. 100점 준다.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; -----> ssl_protocols TLSv1.2;
  • Cipher Strength(암호 강도) 높이려면 이렇게 256 조합 100점 준다.
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
ssl_prefer_server_ciphers on;
.....
  • 보안 강도를 너무 높이면 구형 브라우저는 페이지 열리지 않음.

기타

  • http2 테스트 tools.keycdn.com 사이트에서 할 수 있다.
  • Let's Encrypt 인증서 테스트 dev.ssllabs.com 사이트에서 할 수 있다.
  • nginx에서 http2 설정 후 속도 테스트 괜찬다.
  • 운영하면서 계속 업데이트 됩니다.
  • 뭐좀 하려하면!!!!!! 설정 해 주어야 된다. OTL...
  • 참고사항으로 남김.


Logo