Special:Communication & Concept/ubuntu 18.04.1 서버에서 Nginx, Mysql, PHP, phpMyAdmin 를 설치하기위한 방법.

Jump to: navigation, search
#174 [ Ssam ] hit: 87(#a8ffa8)

Template:Quotation

서버 업데이트 밎 업그레이드

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get autoremove
  • open-vm-tools 업그레이드 하면 자동 설치된다 설치가 안되어 있다면 아래 명령어
sudo apt-get install open-vm-tools

ubuntu 18.04.1 고정 아이피 설정

  • 설정 파일은 /etc/netplan 에 있다.
$ cd /etc/netplan
$ ls -a 
01-netcfg.yaml 이 파일이 보이네요, 파일명은 조금씩 다를 거 입니다.
sudo vi /etc/netplan/01-netcfg.yaml
아래와 같이 수정, 칸 잘 맞춰서 해야 에러 없음.
고정 아이피는 192.168.0.30으로 설정 할 것임.


network:
  version: 2
  renderer: networkd
  ethernets:
    ens16:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.0.30/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [168.126.63.1,168.126.63.2]

  • Error in network definition //etc/netplan/~ 에러, 제일 아래 addresses: [168.126.63.1,168.126.63.2] 부분에서 앞에 탭 칸 두어야 에러 없음.
  • 수정 적용
sudo netplan apply

hostname 변경

  • 에디터 vi /etc/cloud/cloud.cfg 파일을 열어 변경 한다.
preserve_hostname: false를 true로 변경한다.
preserve_hostname: true
  • 에디터 vi /etc/hostname 파일을 열어 변경 후 재부팅 한다.


hostname 확인

~$ hostname -f 

Nginx 웹서버 설치

sudo apt-get install nginx
  • 버전확인
nginx -v
  • Nginx 설치 상태 확인
sudo systemctl status nginx.service 
sudo systemctl restart nginx.service
  • 참고 Nginx관련 명령어
sudo systemctl stop nginx.service
sudo systemctl start nginx.service
sudo systemctl restart nginx.service
sudo systemctl enable nginx.service
  • 참고 삭제 명령어
sudo systemctl stop nginx.service
sudo apt-get purge nginx nginx-common
sudo apt-get autoremove
  • 브라우저(browser)에서 확인
http://192.168.0.30


MariaDB 서버 설치

sudo apt-get install mariadb-server
sudo systemctl status mysql.service
sudo systemctl restart mysql.service
  • MariaDB 에서 root 비밀번호 설정
sudo mysql_secure_installation
메세지 답변
  1. Enter current password for root (enter for none): 엔터
  2. Set root password? [Y/n] y
  3. New password: 설정할 root 비밀번호를 입력
  4. Re-enter new password: 비밀번호 재입력
  5. Remove anonymous users? [Y/n] y
  6. Disallow root login remotely? [Y/n] y
  7. Reload privilege tables now? [Y/n] y


sudo systemctl stop mysql.service
sudo systemctl start mysql.service
sudo systemctl restart mysql.service
sudo systemctl enable mysql.service
sudo apt-get purge mariadb-server
sudo apt-get purge mariadb-common
sudo apt autoremove


PHP7.2 설치

sudo apt-get install php7.2 php7.2-fpm php7.2-common php7.2-mysql php7.2-gd php7.2-curl php7.2-mbstring php7.2-json php7.2-zip php7.2-imap php7.2-xml
  • 버전확인
$ php -v


설치해야될 모듈
  1. php7.2-mbstring 모듈 설치 권장, 안 하면 phpmyadmin설치시 mbstring 오류 난다.
  2. php7.2-zip (owncloud 설치 시 요구함)
  3. php7.2-imap 메일 설정시 필요.
  4. APCu PHP cache 설치 (owncloud 설치시 경고 나온다, 필수!!! 미디어위키 설치시 캐쉬 적용, 메인 페이지 캐쉬 적용, 기타 캐쉬 적용으로 로딩 속도 10배까지 끌어 올릴 수 있다.)
sudo apt-get install php-apcu


  • PHP7에서 MariaDB 서포트 해주는 모듈을 검색해 보면 주르르 나온다.
sudo apt-cache search php7.2
메세지 아래와 같은것을 설치 할 수 있다
  1. php7.2 - 서버사이드, HTML 내장 스크립팅 언어 (메타패키지)
  2. php7.2-zip - Zip module for PHP
  3. [..........]


  • php7.2-fpm 스크립트 재시작
sudo systemctl restart php7.2-fpm.service
  • 액티브 상태 확인
sudo systemctl status php7.2-fpm.service
  • 설치 후 참고 명령 php7.2-fpm
sudo systemctl stop php7.2-fpm.service
sudo systemctl start php7.2-fpm.service
sudo systemctl restart php7.2-fpm.service


  • 참고 명령어 php7.2 삭제
sudo systemctl stop php7.2-fpm.service
sudo apt-get purge php7.2 php7.2-common
sudo apt-get autoremove


php 정보 확인

  • 이 파일 /etc/nginx/sites-available/default 을 열어서, 서버네임, 루트, index.php, fastcgi_pass unix:/run/php/php7.2-fpm.sock; 를 수정 한다.
sudo vi /etc/nginx/sites-available/default
아래와 같이 수정 한다.

# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.

# Default server configuration
server {
        listen 80;
        listen [::]:80;

        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name 192.168.0.30;

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

        location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
 
        # deny access to .htaccess files, if Apache's document root
        #location ~ /\.ht {
        #       deny all;
        #}
}

  • 이 파일 vi /etc/nginx/sites-available/default 에 대하여
  1. 자동으로 사이트 활성된다.
  2. listen 80 default_server; 와 listen [::]:80 default_server; 을 listen 80; 와 listen [::]:80; 로 수정하고 사설 192.168.0.30 로컬에서만 접속.
  3. 이 파일 sudo vi /etc/nginx/snippets/fastcgi-php.conf 참고.
  4. phpmyadmin 접속 용도로 사용 할 것이다..


  • Nginx 재시작
sudo systemctl restart nginx.service


  • 테스트
sudo vi /var/www/html/info.php
  • vi에디터로 아래와같이 info.php 파일을 작성해 준다.
<?php
  phpinfo();
  • 브라우저(browser)에서 php 정보 확인
http://192.168.0.30/info.php
  • php 정보 확인 다 됬으면 phpinfo.php 파일 삭제
sudo rm -f /var/www/html/info.php


phpMyAdmin 설치

  • 자동 설치하고 비번넣고, 엔진엑스(Nginx)이므로 아파치 연결 안함, 그냥 설치만 함
sudo apt update
sudo apt-get install phpmyadmin
메세지 답변
  1. Web server to configure automatically: 선택옵션 메세지에서 apache2 선택에서 아무것도 체크하지 않는다.
  2. Configure database for phpmyadmin with dbconfig-common? 메세지에서 Yes
  3. MySQL application password for phpmyadmin: 메세지에서 비번 입력
  • phpmyadmin 파일들은 /usr/share/phpmyadmin 여기에 설치되어 있으므로 심볼 링크로 계정에 걸어 사용하거나 아래와 같이 192.168.0.30
sudo ln -s /usr/share/phpmyadmin /home/사용자/www/html
  • 보안을 위해서 local IP 만 접속 가능한 곳에 192.168.0.30 아이피에 심볼링크로 걸어 사용한다.
sudo ln -s /usr/share/phpmyadmin /var/www/html
  • 브라우저에서 접속

http://192.168.0.30/phpmyadmin/


로그인 아이디: phpmyadmin 암호: 메세지에서 입력한 비번, 로그인되나 root 계정이 아니라 디비 생성 권한이 없다.


이렇게 되어 있다.
CREATE USER 'phpmyadmin'@'localhost' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;


  • mysql 쉘 접속 (mysql -u root -p)
sudo mysql --user=root mysql
  • root로 접속이 안된다, 랜덤으로 바뀐다, 모든 모든 설정이 끝나면 root계정은 보안을 위해서 지우고 사용해야 된다. phpmyadmin 계정을 잠시 모든 권한을 준다.
MariaDB shell [(none)] >
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
MariaDB shell [(none)] >
FLUSH PRIVILEGES;
MariaDB shell [(none)] >
quit
  • mysql 재시작
sudo systemctl restart mysql
  • 웹브라우저에서
  1. phpmyadmin계정으로 로그인 한 다음 관리자가될 사용자를 만들고 모든 권한을 준뒤에 디비 재시작 후 로그인 해본다, 잘 되면 phpmyadmin 의 모든 권한을 제거하고, root 계정도 제거 한다.
  2. 파일에 root 암호가 안남아 있어서 그만큼 안전하다.
  • mysql 재시작
sudo systemctl restart mysql
  • 이제 아무 권한이 없는 phpmyadmin의 비번은 여기 있다.
/etc/dbconfig-common/phpmyadmin.conf


phpmyadmin 에러 수정

  • phpmyadmin 이 에러가 난다. 이렇게 Warning in ./libraries/sql.lib.php#613 count(): Parameter must~~~~~~
  • 이 파일 /usr/share/phpmyadmin/libraries/sql.lib.php을 열어 수정한다.
sudo vi /usr/share/phpmyadmin/libraries/sql.lib.php
613라인쯤에 이렇게된 부분 || (count($analyzed_sql_results[‘select_expr’] == 1) 이 부분을 아래와 같이 수정, 이 부분 ) 을 수정한다.
|| (count($analyzed_sql_results[‘select_expr’]) == 1


  • 참고 phpmyadmin 삭제 명령어
sudo apt-get purge phpmyadmin
sudo apt-get autoremove
  • 아무나 엑세스 할 수 없도록 접근제한을 해 두는게 좋음, 특정 아이피만 접속하게 또는 외부로 접속이 안되는 로컬 사설 아이피만 접속 가능하게......


엔진엑스(Nginx) 서버 기본 환경 설정

sudo vi /etc/nginx/nginx.conf
아래와 같이 수정 한다.

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 4096;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

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

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        # ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE, TLSv1, 1.1 Security Issues, TLSv1.3 Coming soon.
        # ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

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

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

  • 여러 기본 설정들을 할 수있는 항목들이 나온다, user www-data; , worker_processes auto; 잘 되어있나 확인.


가상 호스트 설정 전에 할 것

  • 사용자 계정 추가
sudo adduser ssam
암호 물어봄 암호 적어주고 엔터 엔터,... 네.
  • 사용자 웹디렉토리 만들기
sudo mkdir -p /home/ssam/www/html
  • 사용자 웹디렉토리 퍼미션 조정.
sudo chmod -R 755 /home/ssam/www/html
  • 사용자/그룹 변경, 데비안계열 www-data, FreeBSD 계열 www, 기타.
sudo chown -R ssam:ssam /home/ssam/www/html
  • 사용자 www-data 그룹에 가입
sudo usermod -a -G www-data ssam
  • 엔진엑스(Nginx) 환경 설정, 재작성 해야되므로 default-dist이름으로 원본파일을 남기고 재작성 한다.
  • 원본파일 남기기
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default-dist
  • 여러개의 사이트 사용해야되므로 default파일로부터 복사.
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mysam.net
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/zbm.kr
  • 사이트 활성, 심볼 링크를 걸어 준다.
sudo ln -s /etc/nginx/sites-available/mysam.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/zbm.kr /etc/nginx/sites-enabled/


미디어위키 설치

미디어위키 다운로드

  • 다운로드된 파일을 계정에 업로드한다
  • 사용자 계정에서 디렉토리로 이동 후 압축 해제
cd /home/ssam/www/html
$ tar xvzf mediawiki-1.31.X.tar.gz
  • 디렉토리를 wiki로 변경
$ mv mediawiki-1.31.X wiki
  • 압축된 파일 삭제
$ rm -f mediawiki-1.31.1.tar.gz
root로 했다면 소유권 변경해야 된다.
$ sudo chown ssam:ssam -R /home/ssam/www/html
  • 사용자 웹디렉토리 퍼미션 조정.
$ sudo chmod -R 755 /home/ssam/www/html
  • 파일 권한 실행은 모두제거, 본인 읽고, 쓰기, 모두 실행 제거
$ sudo chmod -R a-x+X /home/ssam/www/html/wiki
또는
$ sudo chmod -f 644 /home/ssam/www/html/wiki 
  • 미디어위키 웹브라우저에서 설치
http://mysam.net/wiki
미디어위키 설치시 캐쉬를 설정하여 설치 한다, 로딩 속도가 10배 는 빨라진다.
캐쉬 설정 방법은 아래 미디어위키 관련글을 참고


미디어위키에 추천된 가상호스트 엔진엑스(Nginx) 환경 설정

  1. 엔진엑스(Nginx) 환경 설정, PHP FastCGI Example 참조.
  2. 여기 많은 추천 견본 Nginx 사이트 참고.
  3. 미디어위키를 설치 할 것이니 Nginx 에서 추천된 것을 참고하여 수정 함.


mysam.net 최종 설정
sudo vi /etc/nginx/sites-available/mysam.net
아래와 같이 설정 한다.

 # https://www.nginx.com/resources/wiki/start/topics/recipes/mediawiki/
 server {
         # SSL configuration
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

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

        server_name mysam.net *.mysam.net;
        root /home/사용자/www/html;
        index index.php index.html;
 
        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$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
 
        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 /home/사용자/www/html/wiki/local;
                autoindex on;
        }
 }

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

  • Nginx 과 php7.2-fpm 재시작
sudo systemctl restart nginx.service
sudo systemctl restart php7.2-fpm.service
  • mysam 설정 파일
sudo vi /etc/nginx/sites-available/mysam.net
  • 인증서 설치 설정
sudo vi /etc/nginx/snippets/ssl-mysam.net.conf
인증서 공통으로 들어갈 것 설정
sudo vi /etc/nginx/snippets/ssl-params.conf
  • php 스크립트 연동 설정 참고
sudo vi /etc/nginx/snippets/fastcgi-php.conf


  • 기본서버 체크, 기본 서버 설정은 한 개만 가능 하다.
grep -R default_server /etc/nginx/sites-enabled/
기본서버가 mysam.net 로 되어 있다.


  • 설정 파일 vi /etc/nginx/sites-available/mysam.net 에 대해서 참고.
  1. 보안 인증서SSL 와 HTTP2을 설정.
  2. 웹루트를 기본 /var/www/html 에서 사용자 /home/사용자/www/html 디렉토리로 변경 했다.
  3. 미디어위키를 /wiki 디렉토리에 설치하여 사용하므로 경로를 수정했다.
  4. 참고로 미디어위키 LocalSettings.php 파일을 열어 수정 해 주어야 주소 형태가 도메인/wiki/제목 형태가 됬다.
  • LocalSettings.php 파일 내용
[............................]
$wgScriptPath = "/wiki";
$wgArticlePath = "$wgScriptPath/$1";
$wgUsePathInfo = true; //주소형태 /index.php/페이지_제목 
//$wgUsePathInfo = false; //주소형태 /index.php?title=페이지_제목
[..............................]


zbm.kr 최종 설정 같은 개념
sudo vi /etc/nginx/sites-available/zbm.kr
아래와 같이 설정한다.

 # https://www.nginx.com/resources/wiki/start/topics/recipes/mediawiki/
 server {
        # SSL configuration
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/ssl-zbm.kr.conf;
        include snippets/ssl-params.conf;
 
        server_name zbm.kr www.zbm.kr;
        root /home/사용자/www/html;
        index index.php index.html;
 
        [...........................]
 
        location /dumps {
                root /home/사용자/www/html/wiki/local;
                autoindex on;
        }
 }
 
 server {
        listen 80;
        listen [::]:80;
        server_name zbm.kr www.zbm.kr;
       return 301 https://$server_name$request_uri;
 }


sudo systemctl restart nginx.service


  • mysam 설정 파일
sudo vi /etc/nginx/sites-available/zbm.kr
  • 인증서 설치 설정
sudo vi /etc/nginx/snippets/ssl-zbm.kr.conf
인증서 공통으로 들어갈 것 설정
sudo vi /etc/nginx/snippets/ssl-params.conf
  • php 스크립트 연동 설정 참고
sudo vi /etc/nginx/snippets/fastcgi-php.conf


PHP7.2 환경 설정

  • 대용량 파일을 사용하므로 파일 업로드 사이즈 조정
  • 이 파일 vi /etc/php/7.0/fpm/php.ini 을 열어 수정한다.
  • 클라우드 설치 대비, upload_max_filesize 2000M, post_max_size 2001M, max_execution_time, max_input_time는 10배로, memory_limit는 2배로
sudo vi /etc/php/7.2/fpm/php.ini
383라인쯤에
max_execution_time = 300
393라인쯤에
max_input_time = 600
404라인쯤에
memory_limit = 256M
672라인쯤에
post_max_size = 2001M
825라인쯤에
upload_max_filesize = 2000M

이 부분을 찾아서 적당한 크기로 수정해 준다

  • 보안설정
836라인 쯤에 Off 로 설정
allow_url_fopen = Off


  • php7.2-fpm 스크립트 재시작
sudo systemctl restart php7.2-fpm.service


인증서 설치

  • Let's Encrypt 인증서 경로에 대해서
  1. 이미 인증서는 다른 OS에 설치되어 있고, 백업된 인증서로 설치 해야 할때.
  2. /etc/letsencrypt/live/mysam.net 이 디렉토리에 인증서 파일을 복사 한다.
  3. SSL 인증서 관련 디렉토리 퍼미션은 400으로 유지한다.


  • 이 파일 sudo vi /etc/nginx/snippets/ssl-mysam.net.conf 을 생성하여 아래 내용을 추가한다.
#Let's Encrypt add
ssl_certificate /etc/letsencrypt/live/mysam.net-00011/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysam.net-00011/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/mysam.net-00011/fullchain.pem;
  • 이 파일 sudo vi /etc/nginx/snippets/ssl-zbm.kr.conf 을 생성하여 아래 내용을 추가한다.
#Let's Encrypt add
ssl_certificate /etc/letsencrypt/live/zbm.kr-00011/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/zbm.kr-00011/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/zbm.kr-00011/fullchain.pem;


  • 공통 이 파일 sudo vi /etc/nginx/snippets/ssl-params.conf 을 생성하여 아래 내용을 추가한다.

 ssl on;
 ssl_protocols  TLSv1.2;
 ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
 ssl_prefer_server_ciphers on;
 ssl_session_cache shared:SSL:50m;
 ssl_session_timeout 1d;
 ssl_session_tickets on;
  
 #OCSP Stapling
 ssl_stapling on;
 ssl_stapling_verify on;
 resolver 8.8.8.8 8.8.4.4;
  
 # Security 
 add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";


http2 지원

  • 위에서 이미 설정되어 있다.
  • SSL 보안 인증서가 설치되야 지원된다.
sudo vi /etc/nginx/sites-available/mysam.net
아래와 같이 수정 한다.


 server {  
        # SSL configuration
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        ...................................
        [  ..............................  ]
        ....................................
  
 }

  • Nginx 재시작
sudo systemctl restart nginx.service
  • php7.2-fpm 스크립트 재시작
sudo systemctl restart php7.2-fpm.service

크론탭

  • DDNS 스크립트 넣어서 돌리면 잘 돌아가감.
sudo vi /etc/crontab


기타

  • http2 테스트 tools.keycdn.com 사이트에서 할 수 있다.
  • Let's Encrypt 인증서 테스트 dev.ssllabs.com 사이트에서 할 수 있다.
  • nginx에서 http2 설정 후 속도 테스트 Apache나 nginx 다 괜찬은데 nginx가 퍽하면 40X로 넘기네요 좀쓰다, 퍽~.
  • 운영하면서 계속 업데이트 됩니다.
  • 참고사항으로 남김.


Logo