CentOS 6, CentOS 7에서 nginx 1.14.2, mysql 8.0.15, php 7.3.4 설치 및 연동

| 2019년 4월 11일 | 0 Comments

안녕하세요. 스마일서브 기술지원팀 신규철입니다.
nginx, mysql, php 를 설치해보도록 하겠습니다. 버전은 위키피디아에

나와있는 stable version을 참고하여설치하겠습니다.

CentOS 6, CentOS 7 환경에서 설치했으며, 설치 방법은 거의 동일합니다.

설치 환경 및 버전입니다.
OS = CentOS 6.10(Final) , CentOS 7.6.1810(Core)
nginx = 1.14.2
mysql = 8.0.15
php = 7.3.4

 

** 사진이 작으면 클릭해서 봐주세요.

** 글의 내용을 그대로 복사하면 제대로 복사가 안될 수 있습니다. 메모장에 한번 붙여넣기 한 뒤 다시 복사해서 사용해주세요.


 

mysql 8.0.15 설치

mysql 설치 간에 필요한 패키지를 설치합니다.
#yum install -y cmake ncurses-devel openssl openssl-devel

 

설치 도중 메모리 관련 에러가 발생했었습니다. 따라서 미리 스왑 메모리를 증설해 놓겠습니다. 저는 4GB만큼 증설하였습니다.

#dd if=/dev/zero of=/var/swapfile bs=1024 count=4096000
#mkswap /var/swapfile
#swapon /var/swapfile

 

증설 후 free -m 명령어를 통해 제대로 스왑 메모리가 생겼는지 확인합니다.

 

저 같은 경우 리부팅 후에도 지속적으로 스왑 메모리가 적용되도록 설정해줬습니다.
#vi /etc/fstab
…(생략)
/var/swapfile    swap    swap    defaults    0  0

*make 도중 …sql/CMakeFiles/sql_gis.dir/item_geofunc_setops.cc.o 에러 또는 c++: fatal error: Killed signal terminated program … .가 발생하면 스왑메모리를 증설해주시면 됩니다.

 

mysql을 설치할 때 cmake 후 make 명령어를 수행하면 gcc 버전이 낮아 json 관련 에러가 발생합니다. 따라서 gcc를 미리 8.x 버전대로 업데이트 해놓겠습니다.
(CentOS 6의 경우 4.2.x 버전, CentOS 7 버전의 경우 4.5.x 버전으로 gcc가 설치될 것입니다.)

#yum install centos-release-scl
#yum install devtoolset-8-gcc devtoolset-8-gcc-c++
#scl enable devtoolset-8 — bash

 

설치 후 버전을 확인해보면 8.2.1 버전으로 변경된 것을 확인할 수 있습니다.

#gcc –version
#g++ –version

 

리부팅후에도 gcc 버전이 적용될 수 있도록 /root/.bashrc 파일에 아래 내용을 추가해줍니다.

#vi /root/.bashrc
…(생략)
source /opt/rh/devtoolset-8/enable

 

이제 mysql 그룹 및 계정을 생성합니다.

#groupadd -g 400 mysql
#useradd -u400 -g400 -d /usr/local/mysql -s /bin/false mysql

 

계정을 생성했으니 mysql을 설치해보겠습니다.

#cd /usr/local/src
#wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15.tar.gz
#tar xvfz mysql-8.0.15.tar.gz
#cd mysql-8.0.15
#mkdir build
#cd build

-> mysql 상위 버전부터 빌드를 위한 디렉토리를 따로 만든 뒤 해당 디렉토리에서 작업하도록 변경되었습니다. 만약 빌드를 위한 별도의 디렉토리를 만들지 않고 cmake를

진행하면 다음과 같은 에러가 발생할 것입니다.

CMake Error at CMakeLists.txt:283 (MESSAGE):
Please do not build in-source. Out-of source builds are highly
recommended: you can have multiple builds for the same source, and there is
an easy way to do cleanup, simply remove the build directory (note that
‘make clean’ or ‘make distclean’ does not work)
 
You can force in-source build by invoking cmake with
-DFORCE_INSOURCE_BUILD=1
 
— Configuring incomplete, errors occurred!
 
 
cmake 다음에 ‘..(점 두개)’ 을 꼭 입력해주세요.
#cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 \
-DWITH_SSL=system -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/include/boost
#make && make install

 

CentOS 6의 경우 make 도중 다음과 같은 에러가 발생할 수 있습니다.

cannot find any C preprocessor (cpp)
/usr/bin/rpcgen: C preprocessor failed with exit code 1
make[2]: *** [plugin/group_replication/libmysqlgcs/xdr_gen/xcom_vp.h] 오류 1
make[1]: *** [plugin/group_replication/libmysqlgcs/CMakeFiles/mysqlgcs.dir/all] 오류 2
make: *** [all] 오류 2

해당 에러는 다음과 같이 해결해줍니다.

#cp -arp /usr/bin/cpp /lib64/
#cp -arp /usr/bin/cpp /lib/

 

make install 까지 완료되었으면 이제 데이터베이스를 구성해줍니다.

#/usr/local/mysql/bin/mysqld –initialize-insecure –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –user=mysql

 

디렉토리 및 파일에 대한 권한을 설정해줍니다.

#chown -R mysql.mysql /usr/local/mysql/
#chmod 711 /usr/local/mysql
#chmod 700 /usr/local/mysql/data
#chmod 751 /usr/local/mysql/bin/
#chmod 750 /usr/local/mysql/bin/*
#chmod 755 /usr/local/mysql/bin/mysql
#chmod 755 /usr/local/mysql/bin/mysqldump

 

boost를 설치해줍니다.

#cd /usr/local/include/boost/boost_1_68_0
#./booststrap.sh
#./b2 install

 

설정파일을 수정해줍니다.

#vi /etc/my.cnf

[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
port=3306
socket=/tmp/mysql.sock
 
[mysqld_safe]
log-error=/var/log/mysql_log.err
pid-file=/usr/local/mysql/mysql.pid

 

mysql 실행파일을 옮긴 뒤 리부팅후에도 자동으로 mysql이 실행되도록 설정해줍니다.

#cp -arp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
#chkconfig –add mysqld
#chkconfig mysqld on
 
 
모든 설정이 완료되었으면 방화벽에서 mysql 포트인 3306을 열어줍니다. 서버마다 사용하는 방화벽이나 설정이 다를 수 있으니 해당 부분은 생략하겠습니다.
방화벽 설정 및 재시작을 한 뒤 mysql을 싱행해보겠습니다.
#/etc/init.d/mysqld start
다음과 같이 mysql이 실행된 것을 확인할 수 있습니다.
 
이제 mysql의 초기 패스워드를 설정해주겠습니다. 처음엔 패스워드가 설정되어 있지 않기 때문에 바로 접속이 가능합니다.
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘패스워드’;
Query OK, 0 rows affected (0.02 sec)
 
 
mysql 기본 언어셋을 설정해주겠습니다. 저같은 경우는 utf8로 설정해줬습니다.
#vi /etc/my.cnf.d/mysql-clients.cnf
 
[mysql]
default-character-set=utf8
 
[mysqldump]
default-character-set=utf8
 
 #vi /etc/my.cnf
 
[mysqld]
collation-server = utf8_unicode_ci
init-connect=’SET NAMES utf8′
character-set-server = utf8
 
my.cnf를 수정했으니 mysql을 재시작하여 수정한 내용을 적용시켜줍니다.
#/etc/init.d/mysqld restart
 
utf8로 변경되었는지 확인해보겠습니다.
#/usr/local/mysql/bin/mysql -u root -p
mysql> show variables like ‘c%’;
+———————————————-+———————————-+
| Variable_name                                | Value                            |
+———————————————-+———————————-+
| caching_sha2_password_auto_generate_rsa_keys | ON                               |
| caching_sha2_password_private_key_path       | private_key.pem                  |
| caching_sha2_password_public_key_path        | public_key.pem                   |
| character_set_client                         | utf8                             |
| character_set_connection                     | utf8                             |
| character_set_database                       | utf8                             |
| character_set_filesystem                     | binary                           |
| character_set_results                        | utf8                             |
| character_set_server                         | utf8                             |
| character_set_system                         | utf8                             |
| character_sets_dir                           | /usr/local/mysql/share/charsets/ |
| check_proxy_users                            | OFF                              |
| collation_connection                         | utf8_general_ci                  |
| collation_database                           | utf8_unicode_ci                  |
| collation_server                             | utf8_unicode_ci                  |
| completion_type                              | NO_CHAIN                         |
| concurrent_insert                            | AUTO                             |
| connect_timeout                              | 10                               |
| core_file                                    | OFF                              |
| create_admin_listener_thread                 | OFF                              |
| cte_max_recursion_depth                      | 1000                             |
+———————————————-+———————————-+
21 rows in set (0.00 sec)
 
이상으로 mysql 8.0.15 설치를 마치겠습니다.
 

 
nginx 1.14.2 설치
 
nginx 설치에 필요한 필수 패키지를 설치합니다.
#yum install -y libxml2-devel libxml2-static libxslt libxslt-devel gd gd-devel
 
pcre, zlib, openssl 을 설치합니다. 압축만 풀어주시면 됩니다.
#cd /usr/local/src
#wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz
#tar xvfz pcre-8.42.tar.gz
#wget http://zlib.net/zlib-1.2.11.tar.gz
#tar xvfz zlib-1.2.11.tar.gz
#wget http://www.openssl.org/source/openssl-1.1.1b.tar.gz
#tar xvfz openssl-1.1.1b.tar.gz
 
 
이제 nginx를 설치하겠습니다.
#cd /usr/local/src
#wget http://nginx.org/download/nginx-1.14.2.tar.gz
#tar xvfz nginx-1.14.2.tar.gz
#cd nginx-1.14.2
#./configure –prefix=/usr/local/nginx –with-pcre=../pcre-8.42 –with-zlib=../zlib-1.2.11 –with-openssl=../openssl-1.1.1b –with-http_ssl_module –with-http_stub_status_module
#make && make install
 
nginx를 실행 및 리부팅시 자동실행 될 수 있도록 스크립트를 작성해줍니다.
(복사가 제대로 안될수도 있습니다.)
 
#vi /etc/init.d/nginx
#!/bin/sh
#
# nginx – this script starts and stops the nginx daemin
#
# chkconfig:   – 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ “$NETWORKING” = “no” ] && exit 0
 
nginx=”/usr/local/nginx/sbin/nginx”
prog=$(basename $nginx)
 
NGINX_CONF_FILE=”/usr/local/nginx/conf/nginx.conf”
 
lockfile=/var/lock/subsys/nginx
 
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $”Starting $prog: “
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $”Stopping $prog: “
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    configtest || return $?
    stop
    start
}
 
reload() {
    configtest || return $?
    echo -n $”Reloading $prog: “
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
 
case “$1” in
    start)  
        rh_status_q && exit 0
        $1      
        ;;      
    stop)   
        rh_status_q || exit 0
        $1      
        ;;      
    restart|configtest)
        $1      
        ;;      
    reload)
        rh_status_q || exit 7
        $1      
        ;;      
    force-reload)
        force_reload
        ;;      
    status)
        rh_status
        ;;      
    condrestart|try-restart)
        rh_status_q || exit 0
        ;;      
    *)
        echo $”Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}”
        exit 2  
esac
 
#chmod 700 /etc/init.d/nginx
#chkconfig –add nginx
#chkconfig nginx on
 
이제 nginx 를 실행하고 사이트에 정상적으로 접근이 되는지 확인해보겠습니다.(그 전에 방화벽에서 80번 포트를 열어주세요)
#/etc/init.d/nginx start
 
인터넷을 켜고 ip주소로 접근했을 때 다음과 같이 나오면 정상적으로 실행 중인것입니다.
 

 
php 7.3.4 설치
 
php 설치에 필요한 패키지들을 설치해줍니다.
#yum install -y curl-devel libtool-ltdl-devel gdbm-devel libc-client-devel bzip2-devel gzip
 
 
mhash를 설치해줍니다.
#cd /usr/local/src
#wget https://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
만약 download파일로 설치되면 mv download mhash-0.9.9.9.tar.gz 로 변경 후 압축해제 한 뒤 진행합니다.
#tar xvfz mhash-0.9.9.9.tar.gz
#cd mhash-0.9.9.9
#./configure
#make && make install
 
libmcrypt를 설치해줍니다.
#cd /usr/local/src
#wget https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
압축 풀고 들어가서
#./configure
#make && make install
 
libzip를 설치해줍니다.
php7.3.4 는 libzip 0.11 이상부터 지원합니다. CentOS 7 기준으로 yum 설치시 0.10이 설치됩니다.
#cd /usr/local/src
#wget https://libzip.org/download/libzip-1.2.0.tar.gz
#tar xvfz libzip-1.2.0.tar.gz
#cd libzip-1.2.0
#./configure
#make && make install
 
이제 php를 설치하겠습니다.
#cd/usr/local/src
#wget https://www.php.net/distributions/php-7.3.4.tar.gz
#tar xvfz php-7.3.4.tar.gz
#cd php-7.3.4
#./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/lib –with-config-file-scan-dir=/etc/php/php.d –with-zlib-dir –enable-mbstring –with-curl –with-zlib –disable-rpath –enable-inline-optimization –enable-sockets –enable-sysvsem –enable-sysvshm –enable-pcntl –enable-mbregex –with-mhash –enable-zip –with-pcre-regex –with-mysqli –with-openssl –with-fpm-user=nobody –with-fpm-group=nobody –enable-fpm –with-pdo-mysql
 
configure 도중 다음과 같은 에러가 발생할 떄
configure: error: off_t undefined; check your library configuration
 
# vi /etc/ld.so.conf
/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64
위의 네줄 추가 후 저장한 뒤,
#ldconfig
 
#make && make install
 
fatal error: zipconf.h 에러 발생시
#cp -arp /usr/local/src/php-7.3.4/lib/zipconf.h /usr/local/include/
또는
#cp -arp /usr/local/src/php-7.3.4/ext/zip/lib/zipconf.h /usr/local/include/
 
 
이제 설정파일들을 복사해주겠습니다. nginx 와 php를 연동하기 위해선 php-fpm이 필요합니다.
#cp /usr/local/src/php-7.3.4/php.ini-production /usr/local/lib/php.ini
#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
#cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
 
php-fpm 실행 파일을 /etc/init.d 에 복사해준 뒤 리부팅시에도 자동으로 실행될 수 있게 chkconfig 설정을 해줍니다.
#cp /usr/local/src/php-7.3.4/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
#chmod 700 /etc/init.d/php-fpm
#chkconfig php-fpm on
 
이제 마지막으로 nginx 와 php 를 연동하여 phpinfo 페이지를 띄워보도록 하겠습니다.
 
#vi /usr/local/nginx/conf/nginx.conf
 
 
server {
…(생략)
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index    index.php;
        fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        include    fastcgi_params;
    }
…(생략)
}
server {~~} 사이에 위의 내용을 추가해줍니다. root 로 documentroot를 정해주지 않았으면 기본경로는 /usr/local/nginx/html 입니다.
위와 같이 설정이 완료되었으면 nginx 와 php-fpm 을 재시작해줍니다.
 
#/etc/init.d/nginx restart
#/etc/init.d/php-fpm start
 
이제 phpinfo.php 파일을 만들고 사이트에 접속해보겠습니다.
#vi /usr/local/nginx/html/phpinfo.php
<?php phpinfo(); ?>
 
 
위와 같이 php 7.3.4 의 phpinfo 페이지가 뜨는것을 확인할 수 있습니다.
 
이상으로 php 7.3.4 설치 및 연동법에 대해 알아봤습니다.
 

 
이제 마지막으로 db가 연동이 됬는지 확인해보도록 하겠습니다. 연동 테스트를 할 php 파일을 만들어줍니다.
 
#vi /usr/local/nginx/html/dbtest.php
 
<!DOCTYPE html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/>
<title>MySql-PHP 연결 테스트</title>
</head>
<body>
<?php
echo “MySql 연결 테스트<br>”;
$db = mysqli_connect(“localhost”, “root”, “패스워드”, “mysql”);
if($db){
echo “connect : 성공<br>”;
}
else{
echo “disconnect : 실패”;
}
$result = mysqli_query($db, ‘SELECT VERSION() as VERSION’);
$data = mysqli_fetch_assoc($result);
echo $data[‘VERSION’];
?>
</body>
</html>
 
위와 같이 설정을 해줍니다.  이후 [서버ip]/db.test 로 접속하여 연동이 잘 되었는지 확인해봅니다.
 
 
연동이 잘되었다면 다음과 같이 mysql 버전(8.0.15)과 함께 성공했다는 페이지가 나올 것입니다.
 
php버전을 낮은 버전으로 진행할 경우 db를 연동할 때 에러가 발생할 때가 있습니다. db.test 페이지로 접속했을 때 아래와 같은 문구가 나올 수 있는데요.
 
The server requested authentication method unknown to the client [caching_sha2_password] 
또는 위의 스크립트를 사용헀다고 가정하고,
CTYPE html> MySql 연결 테스트
disconnect : 실패
 
php에서 caching_sha2_password 인증 방식을 지원하지 않아서 해당 에러가 발생한다고 합니다. mysql 설정 파일에서 인증 플러그인 방식을 변경해주면 해결됩니다.
 
[mysqld]
…(생략)
default_authentication_plugin= mysql_native_password
 
이후 mysql을 재시작 해줍니다.
 
#/etc/init.d/mysqld restart
 
 
이상으로 CentOS 6, CentOS 7에서 nginx 1.14.2/mysql 8.0.15/php 7.3.4 설치 및 연동법에 대해 알아봤습니다. 감사합니다.
 

Tags: , , , ,

Category: LINUX

About the Author ()