mariadb-10.0.15 CentOS 7 소스
CentOS 7 를 위한 mariadb-10.0.15 버전 입니다. 10.0.14 버전의 보안 패치를 적용하고 systemd 를 위한 스크립트가 포함되어 있습니다.
다운로드: http://linux.systemv.pe.kr/files/mariadb-10.0.15.tar.gz
설치방법: Mariadb 10 소스 설치
CentOS 7 를 위한 mariadb-10.0.15 버전 입니다. 10.0.14 버전의 보안 패치를 적용하고 systemd 를 위한 스크립트가 포함되어 있습니다.
다운로드: http://linux.systemv.pe.kr/files/mariadb-10.0.15.tar.gz
설치방법: Mariadb 10 소스 설치
CentOS 7 에서 많은 변화가 있지만 그 중에 하나가 싱글 모드(Single Mode) 부팅 입니다.
CentOS 6 에서 싱글모드 부팅을 위해서 부팅 커널 이미지 옵션으로 1 을 입력하면 되었습니다. 하지만 CentOS 7 에서는 그렇게하면 안됩니다.
이 문서는 CentOS 7 싱글모드 부팅 을 어떻게 하는지에 대한 글 입니다.
1. 싱글모드 부팅 (Single Mode Booting)
CentOS 7 에서는 부팅 매니저가 Grub2 로 변경 되었습니다. Grub2 부팅 매니저가 나오면 ‘e’ 를 클릭해서 부팅 커널 이미지를 선택 합니다.
그러면 선택한 커널 이미지에 대한 Grub2 의 각각지 설정값들을 볼수 있으며 커널 이미지와 이에 대한 옵션들을 볼 수 있습니다.
화면를 자세히 보시면 파일시스템 마운트 옵션인 ‘ro’를 보실 수 있습니다. 이부분을 다음과 같이 바꿔 줍니다.
‘ro’ 되어 있던 부분을 ‘rw init=/sysroot/bin/sh’ 로 변경해 줍니다. 그리고 아래부분에 나온대로 Ctrl-x 를 눌러줍니다. 그러면 부팅이 됩니다.
가만히 생각해보면 CentOS 7 에서의 싱글모드 부팅은 CentOS 7 의 복구부팅(Rescue Booting) 과 유사합니다.
CentOS 7 싱글모드로 부팅을 하면 /sysroot 디렉토리로 파일시스템을 rw 모드로 마운팅을 해줍니다.
2. Root 패스워드 리셋
보통 싱글모드 부팅을 하는 많은 목적중에 Root 패스워드 리셋이 있습니다. Root 패스워드를 잊어먹어서 Root 패스워드를 바꾸고 싶을때에 싱글모드로 부팅을 하면 인증없이 Root 쉘을 받을 수 있고 그래서 바로 바꿀 수 있습니다.
그런데 CentOS 7 에서 싱글모드 부팅은 복구모드처럼 부팅을 하기 때문에 먼저 파일시스템을 chroot 를 이용해서 변경해 줍니다.
‘chroot /sysroot’ 로 변경을 하고 패스워드를 변경해 줍니다. ‘touch /.autorelabel’ 는 SELinux 를 신규로 업데이트 해주는 겁니다.
Bash 쉘은 명령어 히스토리 기능을 제공 합니다. history 명령어를 입력하면 지금까지 사용했던 Bash 명령어들이 모두 보여 줍니다.
이러한 기능은 사용자 홈 디렉토리에 ‘.bash_history’ 파일에 기록되어 집니다. 그러나 여러 사람이 사용하는 서버에서 각 사용자 홈 디렉토리에 히스토리를 남기기 보다는 리눅스의 syslog 에 남기게 함으로써 사용자가 못된 일을 하는지 않하는지를 감시하도록 하면 좋을 것입니다.
이 문서는 Bash History 를 Syslog 에 남기기 에 대한 것입니다.
1. logger 를 이용한 방법
logger 는 쉘 명령어를 syslog 에 적도록하는 모듈 입니다. 이를 이용하면 수동으로 syslog 에 기록을 남기게 할 수 있습니다. 이를 이용해서 다음과 같이 /etc/profile.d/cmd.sh 파일을 작성 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function history_to_syslog { declare cmd who=$(whoami) cmd=$(history 1) TTY=`tty` HISNAME="`basename $TTY`" ip=`who |grep pts/${HISNAME} |cut -f 2 -d \(|cut -f 1 -d \)` logger -p local7.notice -- IP=$ip USER=$who, PID=$$, PWD=$PWD, CMD=$cmd } trap history_to_syslog DEBUG || EXIT HISTSIZE=10000 HISTFILESIZE=1000000 HISTTIMEFORMAT="%F %T " export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTFILESIZE HISTTIMEFORMAT INPUTRC declare -r HISTFILE |
이제 이를 Source 해 줍니다.
1 |
source /etc/profile.d/cmd.sh |
2. rsyslog 설정
다음과 같이 설정을 해줍니다.
1 2 3 |
#user command log local7.notice /var/log/bash_history local7.notice @192.168.0.2:514 # udp transfer |
이렇게하면 ‘/var/log/bash_history’ 파일에 Bash 쉘 히스토리가 남기며 ‘192.168.0.2’ 서버에 로그를 전송합니다.
CentOS 7 은 많은 변화가 있었지만 그중 하나가 네트워크 인터페이스 이름 입니다.
지금까지 네트워크 인터페이스 이름은 eth0, eth1 식으로 고정되어 있었습니다. 하지만 CentOS 7 부터는 바이오스 장치 이름을 조합해서 생성됩니다. 다시 말해서 각 서버마다 네트워크 인터페이스 카드가 모두 동일하다고 할지라도 CentOS 7 에서의 네트워크 인터페이스 이름은 모두 다를 수가 있다는 겁니다.
이 문서는 CentOS 7 에서 네트워크 인터페이스 이름 바꾸기 에 대한 것입니다.
1. 상태확인
CentOS 7 에서의 네트워크 인터페이스 이름은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 |
]# ifconfig enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.105 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::a00:27ff:fe97:3935 prefixlen 64 scopeid 0x20<link> ether 08:00:27:97:39:35 txqueuelen 1000 (Ethernet) RX packets 37862 bytes 29870696 (28.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 6939 bytes 513516 (501.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
enp0s3 으로 나옵니다. 네트워크 인터페이스 설정 파일도 이름과 동일하게 생성 됩니다.
1 2 |
]# ls -lh /etc/sysconfig/network-scripts/ifcfg-enp0s3 -rw-r--r--. 1 root root 321 9월 22 13:50 /etc/sysconfig/network-scripts/ifcfg-enp0s3 |
2. eth0 로 바꾸기
바꾸는 방법은 grub 에서 바이오스장치이름을 네트워크 인터페이스 이름으로 사용하지 않겠다고 선언하는 것입니다. 커널이 업그레이드되면 grub 에 파라메터값을 다시 해줘야 하는 불편함을 없애기위해서 grub 의 기본설정을 변경해 줍니다.
1 2 3 4 5 6 7 8 |
]# vim /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="vconsole.font=latarcyrheb-sun16 vconsole.keymap=ko crashkernel=auto rhgb quiet net.ifnames=0 biosdevname=0" GRUB_DISABLE_RECOVERY="true" |
핵심은 ‘GRUB_CMDLINE_LINUX’ 에 ‘net.ifnames=0 biosdevname=0’ 를 추가하는 것입니다. 그리고 다음과 같이 grub2 를 다시 만들어 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-123.9.3.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.9.3.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-123.8.1.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.8.1.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-123.6.3.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-123.6.3.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-babecd961e9a465686311e3f5930f25e Found initrd image: /boot/initramfs-0-rescue-babecd961e9a465686311e3f5930f25e.img done |
이제 네트워크 인터페이스 파일을 다음과 같이 바꿔 줍니다.
1 2 |
]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# mv ifcfg-enp0s3 ifcfg-eth0 |
이제 재부팅을 하면 네트워크 인터페이스 이름이 eth0 로 올라온것을 볼 수 있습니다.
Nvidia 는 AMD 와 함께 그래픽 카드 시장을 양분하고 있는 회사 입니다. 어느쪽이 더 좋은지는 각 회사에 새로운 제품이 출시될때마다 달라질만큼 우열을 가리기 힘듭니다.
Nvidia 와 AMD 는 리눅스를 위한 드라이버도 만들어서 배포하는데 CentOS 7 에서 Nvidia Driver 를 설치하는 방법에 대한 것입니다. 사실 AMD HD2600 을 썼었는데 AMD 에서 더 이상 드라이버를 업데이트를 해주지 않아 그래픽 가속을 쓸수 없었는데, 몇일전에 Nvidia Geforce GTS 450 이 손에 들어와서 설치하는 과정을 정리한 글이기도 합니다.
1. Requirement
Nvidia Driver 를 설치하기 위해서는 컴파일을 위한 의존성 패키지가 설치되어 있어야 합니다. 의존성 패키지는 다음과 같이 설치하시면 됩니다.
1 |
yum install kernel-devel kernel-headers gcc make |
또, Nvidia 를 비롯한 그래픽 카드 드라이버는 커널에 의존적이기 때문에 커널이 바뀌면 재컴파일 설치를 해줘야 합니다. 따라서 이왕설치하는거면 최신 커널에 설치를 하는게 좋을 것입니다. 다음과 같이 커널을 업그레이드 해주고 시스템을 리붓해줍니다.
1 2 |
yum update kernel kernel-devel reboot |
2. Nouveau driver 제거
CentOS 7 에도 Nvidia Driver 가 설치되어 있습니다. 오픈소스 드라이버인데, 여기에는 Nouveau 가 활성화되는 모듈이 포함됩니다. Nvidia Driver 는 이 Nouveau 모듈과 충돌이 나서 설치하는데 지장이 생깁니다.
이는 다음과 같이 확인이 가능 합니다.
1 2 3 4 5 6 7 8 9 10 |
]# lsmod | grep nouv nouveau 974305 1 mxm_wmi 13021 1 nouveau wmi 19070 2 mxm_wmi,nouveau video 19267 1 nouveau i2c_algo_bit 13413 1 nouveau ttm 83948 1 nouveau drm_kms_helper 52758 1 nouveau drm 297829 3 ttm,drm_kms_helper,nouveau i2c_core 40325 5 drm,i2c_piix4,drm_kms_helper,i2c_algo_bit,nouveau |
부팅할때에 nouveau 를 메모리에 올리못하게 하면 이 문제는 해결 됩니다. 다음과 같이 blacklist 에 적어줍니다.
1 2 |
]# vim /etc/modprobe.d/nvidia-disable-nouveau.conf blacklist nouveau |
위와같이 파일을 작성하고 저장한 후에 시스템을 리붓해 줍니다.
3. 설치
Nvidia Driver 를 Nvidia 홈페이지에서 다운받습니다. 그리고 CentOS 7 을 그래픽 모드가 아니 터미널 모드로 전환해주고 다운받은 파일을 실행해 줍니다.
1 2 3 4 |
# init 3 으로 전환 init 3 # 다운로드한 Nvidia Driver 설치 실행 bash NVIDIA-Linux-x86_64-340.58.run |
4. 마치며
nouveau 비활성화는데에는 grub 을 이용할 수도 있습니다. 부팅할때에 grub 에 옵션으로 주면 비활성화를 할 수 있는데, CentOS 7 에선 grub2 를 사용하고 grub2 에서는 공통부분을 /etc/default/grub 에 “rdblacklist=nouveau” 를 추가해줍니다.
1 2 3 4 5 6 7 |
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="ipv6.disable=1 vconsole.font=latarcyrheb-sun16 vconsole.keymap=ko crashkernel=auto rhgb quiet rdblacklist=nouveau" GRUB_DISABLE_RECOVERY="true" |
“GRUB_CMDLINE_LINUX” 에 추가해줍니다.
그리고 grub2 를 갱신해줍니다.
1 |
grub2-mkconfig -o /boot/grub2/grub.cfg |
이렇게하면 blacklist 파일을 작성하지 않고도 nouveau 모듈을 부팅때마다 비활성화 할 수 있습니다.
Apache 는 TCP/IP 접속과 접속이 이루어진 후에 컨텐츠를 처리하는 프로세스의 권한이 다릅니다. TCP/IP 접속관련은 Root 권한으로 동작하고 이후 동작은 아파치의 설정에 따른 권한으로 실행 됩니다.
아파치의 동작 권한은 다음과 같이 설정 합니다.
1 2 3 4 5 6 |
# User/Group: The name (or #number) of the user/group to run httpd as. # It is usually good practice to create a dedicated user and group for # running httpd, as with most system services. # User nobody Group nobody |
위 설정은 아파치의 컨텐츠를 처리하는 프로세스가 nobody:nobody 권한으로 동작하도록 지정한 것입니다.
그런데, 이렇게 하면 버추얼 호스트(VirtualHost) 설정을 할 경우에 보통 각 계정별로 RootDocument 를 설정하는데, 이럴경우 아파치 프로세스는 한가지의 권한으로 동작하고 모든 계정에 접근해야 함으로 각 계정에 액세스 권한을 줘야 합니다. 그래서 주로 다음과 같이 해줘야 합니다.
1 2 3 4 5 |
ls -lh /home/ 합계 0 drwx-----x 2 test test 59 10월 4 23:06 test drwx-----x 2 test1 test1 59 10월 4 23:06 test1 drwx-----x 2 test2 test2 59 10월 4 23:06 test2 |
이러한 아파치 권한과 리눅스 시스템 계정별 권한때문에 공개 CMS 프로그램들(xe, gnuboard, wordpress) 등을 설치할때에 홈디렉토리의 퍼미션을 777 로 하게됩니다. 이럴경우 보안상 큰 문제가 됩니다.
아파치의 컨텐츠 프로세스마다 지정한 시스템 계정의 권한으로 동작하도록 하게 한다면 각 계정별로 퍼미션을 바꿀 필요가 없게 됩니다. 이러한 것을 가능하도록 해주는 모듈이 바로 mod_ruid2 입니다.
이 문서는 Apache mod_ruid2 설치 에 관련된 내용 입니다.
설치 환경은 다음과 같습니다.
mod_ruid2 프로젝트 홈페이지에서 다운로드 받고 압축을 해제한 후에 apxs 를 이용해서 다음과 같이 설치 해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# mod_ruid2 다운로드 wget http://downloads.sourceforge.net/project/mod-ruid/mod_ruid2/mod_ruid2-0.9.8.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmod-ruid%2F&ts=1412085172&use_mirror=cznic # 압축 해제 tar xvjf mod_ruid2-0.9.8.tar.bz2 # 디렉토리 변경 cd mod_ruid2-0.9.8 # 컴파일 설치 /usr/local/apache2.4.10/bin/apxs -a -i -l cap -c mod_ruid2.c /usr/local/apache2.4.10/build/libtool --silent --mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_ruid2.la -lcap -rpath /usr/local/apache2.4.10/modules -module -avoid-version mod_ruid2.lo /usr/local/apache2.4.10/build/instdso.sh SH_LIBTOOL='/usr/local/apache2.4.10/build/libtool' mod_ruid2.la /usr/local/apache2.4.10/modules /usr/local/apache2.4.10/build/libtool --mode=install install mod_ruid2.la /usr/local/apache2.4.10/modules/ libtool: install: install .libs/mod_ruid2.so /usr/local/apache2.4.10/modules/mod_ruid2.so libtool: install: install .libs/mod_ruid2.lai /usr/local/apache2.4.10/modules/mod_ruid2.la libtool: install: install .libs/mod_ruid2.a /usr/local/apache2.4.10/modules/mod_ruid2.a libtool: install: chmod 644 /usr/local/apache2.4.10/modules/mod_ruid2.a libtool: install: ranlib /usr/local/apache2.4.10/modules/mod_ruid2.a libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sbin" ldconfig -n /usr/local/apache2.4.10/modules ---------------------------------------------------------------------- Libraries have been installed in: /usr/local/apache2.4.10/modules If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- chmod 755 /usr/local/apache2.4.10/modules/mod_ruid2.so [activating module `ruid2' in /usr/local/apache2.4.10/conf/httpd.conf] |
모듈 파일이 설치되고 httpd.conf 파일에 이 모듈이 자동으로 활성화 됩니다.
기본적으로 다음과 같이 사용을 하시면 됩니다.
1 2 3 4 5 6 7 8 |
<VirtualHost *:80> ........ ........ <IfModule mod_ruid2.c> RMode config RUidGid test test </IfModule> </VirtualHost> |
이 모듈은 프로세스의 소유권 변환을 해줌으로 보안성을 향상시키지만 다음과 같은 모듈과 호환성을 제공하지 않습니다. (함께 쓸수 없다는 이야기…)
Apache 2.4.10 이후로 SSLSessionCache를 위해선 mod_cache_socache 의 의존성을 가지고 있기 때문에 mod_ruid2 를 사용한다면 SSL 제대로 동작하지 않을 가능성이 있습니다. (mod_cache_socache 는 과거의 mod_mem_cache 입니다.)
MPM event 일 경우에 이것이 동작하지 않는다는게 가장 큰 문제로 보입니다.
IPv4 의 부족분을 대체하기 위해서 IPv6 가 개발되었지만 아직까지 사용빈도가 높지않아 리눅스 IPv6 비활성화 시켜서 자원을 아낄 수 있습니다. 기본적으로 CentOS 6, 7 에서는 IPv6 가 활성화 되어 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 소켓 리스닝 상태 netstat -lpn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1550/rpcbind tcp 0 0 0.0.0.0:39698 0.0.0.0:* LISTEN 1568/rpc.statd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1622/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1698/master tcp 0 0 :::111 :::* LISTEN 1550/rpcbind tcp 0 0 :::22 :::* LISTEN 1622/sshd tcp 0 0 ::1:25 :::* LISTEN 1698/master tcp 0 0 :::57468 :::* LISTEN 1568/rpc.statd udp 0 0 0.0.0.0:877 0.0.0.0:* 1550/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 1550/rpcbind udp 0 0 0.0.0.0:896 0.0.0.0:* 1568/rpc.statd udp 0 0 0.0.0.0:46387 0.0.0.0:* 1568/rpc.statd udp 0 0 0.0.0.0:68 0.0.0.0:* 1462/dhclient udp 0 0 :::877 :::* 1550/rpcbind udp 0 0 :::111 :::* 1550/rpcbind udp 0 0 :::46198 :::* 1568/rpc.statd # 커널 모듈 상태 lsmod | grep ipv6 nf_conntrack_ipv6 8337 2 nf_defrag_ipv6 11156 1 nf_conntrack_ipv6 nf_conntrack 79758 7 xt_conntrack,ipt_MASQUERADE,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state ipv6 318183 153 ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6 |
위와같이 IPv6 가 사용 됩니다.
1. IPv6 커널 모듈 비활성화
다음과 같이 IPv6 커널 모듈이 로딩되지 않도록 해줍니다.
1 |
echo "install ipv6 /bin/true" > /etc/modprobe.d/disable_ipv6.conf |
2. 커널 파라메터 추가
다음과 같이 IPv6 커널 파라메터를 추가해 줍니다.
1 2 |
echo "net.ipv6.conf.default.disable_ipv6=1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf |
이제 재부팅을 해주면 IPv6 가 비활성화 됩니다.
1. Grub2 IPv6 비활성화 옵션 추가
1 2 3 4 5 6 7 8 |
# vim /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="ipv6.disable=1 vconsole.font=latarcyrheb-sun16 vconsole.keymap=ko crashkernel=auto rhgb quiet" GRUB_DISABLE_RECOVERY="true" |
이와같이 GRUB_CMDLINUX_LINUX=”ipv6.disable=1 …” 를 추가 합니다.
그리고 다음과 같이 Grub 을 재성해 줍니다.
1 |
grub2-mkconfig -o /boot/grub2/grub.cfg |
위 절정을 다하고 시스템을 reboot 해주면 IPv6 가 비활성화 됩니다.
Apache 는 전세계 웹 서버로 가장 많이 쓰이는 HTTP 서버 입니다.
Apache 는 최신 2.4 으로 넘어오면서 많은 변화를 겪었습니다.
이 문서는 리눅스 아파치 설치 하는 방법을 설명한 것입니다.
1. 개요
CentOS 7 배포판은 RHEL 7 을 재컴파일해서 만들어진 배포판 입니다. 이전 버전과 달리 서비스 데몬 관리로 Systemd 를 채용했고 기본 파일 시스템으로 XFS 를 채용하는등 많은 변화를 겪었습니다.
CentOS 7 에 서버 프로그램을 설치하게 될 경우에 이 Systemd 와 결합을 시키는 것도 중요한 일로 떠올랐습니다. Systemd 는 단순하게 서비스 데몬을 관리하는 것뿐만 아니라 시스템의 전반적인 인프라자체이므로 매우 중요한 요소가 되었습니다.
이 문서에 Apache 2.4.10 은 바로 Systemd 와 통합하는 방법을 포함 합니다. 이 문서의 내용은 Fedora 22 배포판을 많이 채용한 것입니다.
2. Apache 2.4.10
2.4.10 버전에서는 이전과 달리 기본 MPM으로 Event 입니다. 별도로 MPM을 지정해주지 않으면 Event 로 지정되었습니다. 하지만, 이 기본 Event 가 라이브러리 의존성을 가지고 있기 때문에 라이브러리가 갖추어지지 않았다면 Prefork 와 Worker 가 공유라이브러리로 컴파일되고 설치 이후에 무엇을 쓸것인지를 지정해줘야 합니다.
2.4.10 버전의 경우에 Event 를 활성화하기 위해서는 Apr, Apr-utils 의 버전이 1.5 이상이여 합니다. 하지만 CentOS 7 배포판에서는 현재 1.4 버전임으로 컴파일 설치할때에 1.5 이상을 같이 컴파일 해줘야 합니다.
3. Download and Unpack
Apache 2.4.10 을 Event 로 동작하도록 컴파일 하기위해서 다운로드 합니다.
다운로드한 후에 압축을 해제하고 apr, apr-utils 는 srclib 디렉토리에 압축을 해제하고 버전을 제거한 패키지 이름으로 변경해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# httpd-2.4.10 압축해제 tar xjf httpd-2.4.10.tar.bz2 # apr-1.5.1, apr-util-1.5.4 이동. mv apr-* httpd-2.4.10/srclib/ # 디렉토리 변경 cd httpd-2.4.10/srclib # 압축해제 tar xjf apr-1.5.1.tar.bz2 tar xjf apr-util-1.5.4.tar.bz2 # 디렉토리 이름 변경 mv apr-1.5.1 apr mv apr-util-1.5.4 apr-util # httpd-2.4.10 디렉토리로 이동 mv ../ |
4. Patch Download and Patch
이 패치는 Fedora 22 에 httpd-.2.4.10 패키지에 있는 것을 가지고 온 것 입니다. 여기에는 보안 패치와 더불어 Systemd 와 통합되는 모듈이 들어있습니다.
패치는 다음과 같이 다운로드 받습니다.
download: httpd-2.4.10_patch.tar.bz2
httpd-2.4.10 디렉토리에서 다운로드 받은 파일을 압축해제하고 패치를 적용합니다.
1 2 3 4 |
# 압축해제 tar xvjf httpd-2.4.10_patch.tar.bz2 # 패치적용 ./patch_run.sh |
5.Configure and Compile and install
프로그램에 설정을 할때는 어떤 기능을 쓸것인지를 결정해야 합니다. 어떤 역활로 서버를 사용할 것인지를 고민한 후에 프로그램을 설정하는 것이 좋습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
export CFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_LARGEFILE64_SOURCE' # lib64 Link export LDFLAGS=-Wl,-z,relro,-z,now,-L/usr/lib64 ./configure --prefix=/usr/local/apache2.4.10 \ --enable-pie \ --with-pcre \ --enable-mods-static='dir unique_id vhost_alias log_config logio mime mime_magic alias headers status http negotiation allowmethods include setenvif ssl cache socache_shmcb' \ --enable-mods-shared='cache_disk file_cache deflate expires usertrack actions userdir autoindex cgi auth_digest auth_basic rewrite remoteip ratelimit reqtimeout socache_memcache proxy proxy-fcgi proxy-balancer proxy-ajp proxy-http' \ --enable-mime-magic \ --enable-cern-meta \ --enable-cache \ --enable-data \ --enable-env \ --enable-so \ --enable-mpms-shared=all \ --disable-dir \ --disable-imagemap \ --disable-charset-lite \ --disable-cgid \ --disable-asis \ --disable-authn-socache \ --disable-socache-dbm \ --disable-session_dbd \ --disable-ldap \ --disable-authnz-ldap \ --disable-authz-dbd \ --disable-authn-dbm \ --disable-authn-anon \ --disable-dav \ --disable-dav-fs \ --disable-isapi \ --disable-proxy-connect \ --disable-proxy-ftp \ --disable-proxy-scgi \ --disable-proxy-fdpass \ --disable-proxy-express \ --disable-ext-filter \ --disable-authnz-ldap \ --disable-lbmethod-byrequests \ --disable-lbmethod-bytraffic \ --disable-lbmethod-bybusyness \ --disable-lbmethod-heartbeat \ --disable-dav-lock \ --with-included-apr |
위 configure 는 다음과 같은 기능을 제공하지 않습니다.
이제 컴파일과 설치를 해줍니다.
1 2 3 4 |
# 컴파일 make # 설치 make install |
6. mod_systemd 설치.
httpd-2.4.10 에 Systemd 와 통합을 위한 패치를 했지만 컴파일할때에 모듈설치 옵션을 ‘all’이나 ‘most’ 로하지 않는 이상 컴파일 설치가 되지 않습니다. 이는 apxs 를 이용해서 모듈 설치를 해줍니다.
1 2 3 4 5 6 |
# mod_systemd 모듈 파일이 있는 위치로 이동 cd modules/arch/unix # apxs 를 이용한 mod_systemd 설치 /usr/local/apache2.4.10/bin/apxs -c mod_systemd.c /usr/local/apache2.4.10/build/libtool --silent --mode=compile gcc -std=gnu99 -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_LARGEFILE64_SOURCE -DLINUX -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/local/apache2.4.10/include -I/usr/local/apache2.4.10/include -I/usr/local/apache2.4.10/include -c -o mod_systemd.lo mod_systemd.c && touch mod_systemd.slo /usr/local/apache2.4.10/build/libtool --silent --mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_systemd.la -rpath /usr/local/apache2.4.10/modules -module -avoid-version mod_zystemd.lo |
위에 잘 보면 link 시에 systemd_daemon 링킹이 되지 않습니다. 이것을 다음과 같이 수동으로 다시 만들어 줍니다.
1 |
/usr/local/apache2.4.10/build/libtool --silent --mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_systemd.la -rpath /usr/local/apache2.4.10/modules -module -avoid-version mod_systemd.lo -lsystemd-daemon |
그리고 다음과 같이 설치해 줍니다.
1 |
/usr/local/apache2.4.10/bin/apxs -i -a -n systemd mod_systemd.la |
7. systemd 파일 등록.
이제 httpd 의 systemd 파일을 등록해 줍니다. 파일은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# It's not recommended to modify this file in-place, because it will be # overwritten during package upgrades. If you want to customize, the best # way is to create a file "/etc/systemd/system/httpd.service", # containing # .include /lib/systemd/system/httpd.service # ...make your changes here... # For more info about custom unit files, see # http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F # For example, to pass additional options (for instance, -D definitions) to the # httpd binary at startup, you need to create a file named # "/etc/systemd/system/httpd.service" containing: # .include /lib/systemd/system/httpd.service # [Service] # Environment=OPTIONS=-DMY_DEFINE [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target [Service] Type=notify Environment=LANG=C ExecStart=/usr/local/apache2.4.10/bin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/local/apache2.4.10/bin/httpd $OPTIONS -k graceful # Send SIGWINCH for graceful stop KillSignal=SIGWINCH KillMode=mixed PrivateTmp=true [Install] WantedBy=multi-user.target |
‘httpd.service’ 파일로 저장하고 다음과 같이 systemd 디렉터리로 옮겨 줍니다.
1 |
mv httpd.service /usr/lib/systemd/system |
httpd.service 를 systemd 에 등록하고 시작해주면 됩니다.
1 2 3 4 5 6 |
# systemd 에 httpd 를 활성화 systemctl enable httpd # systemd 릴로드 systemctl daemon-reload # httpd 시작 systemctl start httpd |
실행상태는 다음과 같이 확인 가능 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
systemctl status httpd httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since 토 2014-09-27 19:55:20 KST; 49s ago Main PID: 18166 (httpd) Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec: 0 B/sec" CGroup: /system.slice/httpd.service ├─18166 /usr/local/apache2.4.10/bin/httpd -DFOREGROUND ├─18167 /usr/local/apache2.4.10/bin/httpd -DFOREGROUND ├─18168 /usr/local/apache2.4.10/bin/httpd -DFOREGROUND └─18169 /usr/local/apache2.4.10/bin/httpd -DFOREGROUND 9월 27 19:55:20 localhost.localdomain httpd[18166]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' dir... this message 9월 27 19:55:20 localhost.localdomain systemd[1]: Started The Apache HTTP Server. Hint: Some lines were ellipsized, use -l to show in full. |
추가 관련내용
RabbitMQ 는 AMQP(Advanced Message Queuing Protocol) 를 지원하는 메시징 큐 브로커 입니다. 큐(Queue) 자료구조의 동작방법 그대로 서버로서 역활을 하도록 만든 서버 입니다.
CentOS 7 RabbitMQ 설치 방법을 설명 합니다.
1. EPEL 저장소 추가.
RabbitMQ 는 Erlang 이라는 언어로 작성되었습니다. 따라서 이 패키지가 설치되어 있어야 하는데, CentOS 7 에서는 패키지로 제공하지 않습니다. 대신에 EPEL 저장소를 추가해서 사용 합니다.
1 2 3 4 |
# Epel 저장소 설치. yum install http://mirror.premi.st/epel/7/x86_64/e/epel-release-7-1.noarch.rpm # Erlang 을 설치 yum install erlang |
2. RabbitMQ 설치.
현재(2014년 9월 16일) RabbitMQ 서버의 최신 버전은 ‘3.3.5-1’ 입니다. 이를 설치 합니다.
1 2 3 4 5 6 7 8 |
# rpm 사인 키 추가. rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc # wget 을 이용해 최신의 rabbitmq 버전을 다운로드. wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.5/rabbitmq-server-3.3.5-1.noarch.rpm # yum 을 이용해서 rpm 패키지 설치. yum install rabbitmq-server-3.3.5-1.noarch.rpm |
3. Web Console 활성화.
RabbitMQ 는 Web Console 을 지원 합니다. 이를 위해서 RabbitMQ 의 Console Management 플러그인을 활성화 해주고 서버를 재시작 해줍니다.
1 2 |
# Management 활성화 rabbitmq-plugins enable rabbitmq_management |
4. 서비스 등록
CentOS 7 부터 서비스 관리는 systemd 에서 하도록 변경되었지만 RabbitMQ 는 아직 여기에 대응하지 않습니다. 예전과 같이 chkconfig 도구를 이용해서 서비스를 런레벨(run level) 에 등록해 줍니다.
1 2 |
# RabbitMQ 서버 서비스 등록. chkconfig --level 3 rabbitmq-server on |
5. CentOS 7 에서 시작 문제.
RabbitMQ 의 최신 패키지는 CentOS 7 의 Systemd 를 지원하지 않아 구동을 한다고 하더라도 다음과 같은 오류를 만나게 됩니다.
1 2 3 4 5 |
Aug 20 15:08:51 localhost rabbitmq-server: Starting rabbitmq-server: FAILED - check /var/log/rabbitmq/startup_{log, _err} Aug 20 15:08:51 localhost rabbitmq-server: rabbitmq-server. Aug 20 15:08:51 localhost systemd: rabbitmq-server.service: control process exited, code=exited status=1 Aug 20 15:08:51 localhost systemd: Failed to start LSB: Enable AMQP service provided by RabbitMQ broker. Aug 20 15:08:51 localhost systemd: Unit rabbitmq-server.service entered failed state. |
이는 SELINUX 를 disabled 처리해주면 구동이 가능합니다.
6. Web Console 에 로그인 계정 추가.
메뉴얼에 의하면 Web Console 의 기본 계정인 guest/guest 는 로컬호스트에서 접속할때만 가능합니다. 외부에서 접속할때는 불가능 합니다. 그래서 새로운 계정을 다음과 같이 추가해줍니다.
1 2 3 4 5 6 7 8 |
# 사용자/패스워드 로 계정 생성 rabbitmqctl add_user test test # 계정의 권한을 관리자로 지정 rabbitmqctl set_user_tags test administrator # 접속관련 퍼미션을 지정해 줍니다. rabbitmqctl set_permissions -p / test ".*" ".*" ".*" |
7. firewalld 로 Web Console 접속 포트 개발
RabbitMQ 의 Web Console 은 15672 포트를 사용 합니다. 이를 firewalld 를 이용해서 개방해 줍니다.
1 2 3 4 5 6 7 8 |
# public 존에 15672 TCP 포트 추가 firewall-cmd --permanent --zone=public --add-port=15672/tcp # 적용하기 firewall-cmd --reload # 체크하기 firewall-cmd --zone=public --list-ports |
8. http://서버IP:15672 접속.
이제 웹 브라우저를 열고 http://서버ip:15672 를 하면 로그인 화면이 나옵니다. 여기서 아까 생성한 관리자 아이디/패스워드를 입력해서 로그인이 되면 정상입니다.