Virtual Image 만들기
dd 명령어를 사용해서 다음과 같이 Virtual Image 만들기가 가능하다.
1 |
]# dd if=/dev/zero of=/home/systemv/ubuntu.img bs=1G count=10 status=progress |
10GiB 의 용량을 가진 가상 이미지를 만들어 줍니다.
dd 명령어를 사용해서 다음과 같이 Virtual Image 만들기가 가능하다.
1 |
]# dd if=/dev/zero of=/home/systemv/ubuntu.img bs=1G count=10 status=progress |
10GiB 의 용량을 가진 가상 이미지를 만들어 줍니다.
From: Elementary OS: Loki
Ubuntu 18.04 를 사용중인데, 보안 업데이트를 하기 위해서 apt 명령을 입력했더니 다음과 같이 도메인을 찾을 수 없는 이유로 오류가 생긴다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
root@ubuntu:~# apt update Err:1 http://archive.ubuntu.com/ubuntu bionic InRelease Temporary failure resolving 'archive.ubuntu.com' Err:2 http://security.ubuntu.com/ubuntu bionic-security InRelease Temporary failure resolving 'security.ubuntu.com' Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease Temporary failure resolving 'archive.ubuntu.com' Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease Temporary failure resolving 'archive.ubuntu.com' Reading package lists... Done Building dependency tree Reading state information... Done All packages are up to date. W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease Temporary failure resolving 'security.ubuntu.com' W: Some index files failed to download. They have been ignored, or old ones used instead. |
“Temporary failure resolving” 이게 뭘까 싶어서 알아본 내용을 정리한다.
resolve.conf 파일을 열어보면 다음과 같이 되어 있을 것이다.
1 2 3 4 5 6 7 |
root@ubuntu:~# cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN # 127.0.0.53 is the systemd-resolved stub resolver. # run "systemd-resolve --status" to see details about the actual nameservers. nameserver 127.0.0.53 |
resolv.conf 파일은 다들 알다시피 도메인 네임 서버를 지정해주는 설정 파일로 이 파일이 잘못되면 도메인을 ip로 변환할 수가 없게되어 결국에는 인터넷 연결을 할 수가 없게 된다.
그런데, 위 내용을 보면 도메인 서버 ip는 로컬 호스트로 보이고 코멘트에 이것을 수동으로 바꾸지 말것을 경고하고 있다. 거기다 resolve 상태를 “systemd-resolve –status”로 확인하라고 친절히 안내하고 있다. 이 명령어는 uplink DNS 서버에 대한 상태를 알려준다.
그러면 이 uplink DNS 를 바꿀 수는 없을까?
systemd-resolve 데몬이 이를 수행하는데, 이는 다음과 같은 위치의 파일들을 읽어서 동작한다.
1 2 3 4 |
/etc/systemd/resolved.conf /etc/systemd/resolved.conf.d/*.conf /run/systemd/resolved.conf.d/*.conf /usr/lib/systemd/resolved.conf.d/*.conf |
Ubuntu18.04 에서는 /etc/systemd/resolved.conf 파일이 존재하며 여기에 DNS= 부분에 DNS 서버를 space 로 구분해 리스트로 적어놓을 수 있다.
실제로 ‘DNS=8.8.8.8’ 을 입력하고 ‘systemctl restart systemd-resolved’ 하면 적용되어 apt update 가 잘 동작했다.
Bash 쉘 스크립트를 작성할때 자주 사용하는 로직인 바로 파일 존재 유무를 체크하는 것이다. 파일 하나만 체크할 수도 있고 여러파일을 체크할 수도 있다. 여러 파일을 체크할때는 다음과 같이 할 것이다.
1 2 |
]$ ls *file.txt ls: cannot access *file.txt: 그런 파일이나 디렉터리가 없습니다 |
이것을 Bash 쉘 스크립트에서는 어떻게 리턴을 받아야 하나하는 고민이 생긴다. 가장 쉬운 방법은 stdout, stderror 를 체크하는 방법이다.
Bash 에서 이를 exit code 라고 하고 $? 에 세팅이되어 다음과 같은 로직이 가능해진다.
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash ls *file.txt if [ $? -eq 0 ] then echo "file exist!!" else echo "file doesn't exist!!" >&2 fi |
명령어가 성공(stdout)하면 $?에 0, stderr 면 1 이다. 위를 실행하면 다음과 같다.
1 2 3 |
]$ ./a.sh ls: cannot access *file.txt: 그런 파일이나 디렉터리가 없습니다 file doesn't exist!! |
위 방법외에도 한줄로 다음과 같이 할 수도 있다.
1 |
(ls x.txt && echo yes) || echo no |
AND 와 OR 연산자를 이용해서 메시지를 출력하도록 한다.
하지만 위 방법도 오류 메시지, 혹은 결과가 출력이 되는데 이를 방지하고 결과만 받고 싶다면 다음과 같이 할 수 있다.
1 |
(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no |
이렇게 하면 결과 출력 없이 yes, no 만 출력이 된다.
현재(2018년)에 Trac 을 설치해서 사용하는 사람이 있을지 모르겠지만, 개인적으로 뭔가를 할때 제일 좋은 툴은 것 같다. 그런데, Trac 설치는 가끔 하는거라 할때마다 헤메곤 하는데 기록해두기 위해서 이 글을 작성한다.
Trac 은 현재 Python 2.7 에서 잘 작동한다. Python 2.7 이 설치되어 있어야 한다. 현 시점에서 CentOS 7, Ubuntu 16.04 LTS 에서 기본으로 Python 2.7 이 설치되어 있어 별도로 Python 2.7 을 설치할 필요는 없다.
Trac 뿐만 아니라 Python 의 라이브러리를 설치하기 위해서 pip 를 이용한다. 역시나 이것도 프로그램이라서 pip 를 설치해줘야 한다.
설치하는 방법은 다음과 같이 두가지가 있다.
CentOS 7 과 Ubuntu 16.04 LTS 에서는 pip 패키지를 제공 한다. 별도로 setuptools 을 이용한 설치를 할 필요가 없다.
설치를 마쳤으면 최신버전으로 다음과 같이 업데이트를 해준다.
1 |
]# pip install --upgrade pip |
그리고 setuptools 은 많은 Python 라이브러리들을 설치할때 이용된다. 이것도 CentOS 7, Ubuntu 16.04 LTS 에서 패키지로 제공 한다. 설치해 주자.
현재 2018년 1월에 Trac 최신 버전은 1.3 이다. 하지만 Trac 에 설치되는 플러그인들이 아직 1.2 이상을 잘 지원하지 못한다. 그래서 1.0.1 버전을 설치하기로 했다.
1 2 3 4 5 6 7 |
]# pip install py31compat ]# pip install Trac==1.0.15 ]# pip install TracTocMacro ]# pip install TracAccountManager ]# pip install Pygments ]# pip install Genshi ]# pip install Babel |
이렇게 함으로써 Trac 의 설치는 끝난다.
Trac 은 알겠지만 Project Management 프로그램이다. 그래서 프로젝트를 만들어 줘야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
]# trac-admin /home/Trac/LocalProject initenv /home/Trac/LocalProject에 새로운 Trac 저장소 생성 Trac은 프로젝트 데이터베이스를 초기화하고 준비하기 위해서 당신의 환경에 대해서 몇 가지 질문을 할 것입니다. 프로젝트 이름을 입력해 주십시오. 이 이름은 페이지의 제목과 설명에서 사용될 것 입니다. 프로젝트 이름 [My Project]> LocalProject Please specify the connection string for the database to use. By default, a local SQLite database is created in the environment directory. It is also possible to use an existing MySQL or PostgreSQL database (check the Trac documentation for the exact connection string syntax). 데이터베이스 연결 문자열 [sqlite:db/trac.db]> [그냥 Enter] |
위와같이 프로젝트를 생성해 준다.
프로젝트가 생성이 되었다면 이제 프로젝트를 관리할 ID 에 권한을 부여해줘야 한다. 보통 ID 는 admin 으로 하고 다음과 같이 프로젝트 Administrator 퍼미션(Permision)을 부여해준다.
1 |
]# trac-admin /home/Trac/LocalProject permission add admin TRAC_ADMIN |
admin 이라는 ID 를 추가하면서 퍼미션을 TRAC_ADMIN 으로 부여 했다.
admin 이라는 ID 로 로그인 인증을 위해서는 인증을 위한 방법을 먼저 정의해야 한다. 인증 방법에는 다음과 같이 두가지 방법이 있다.
나의 경우에는 Htdigest 방법을 사용한다. 이를 위해서 AccountManager 플러그인을 설치했다. 그리고 Htdigest 인증 파일을 작성해줘야 한다. 이를 위해서 다음과 같이 Htdigest 인증 파일을 만들어주는 trac-digest.py 파일을 이용한다.
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 |
from optparse import OptionParser # The md5 module is deprecated in Python 2.5 try: from hashlib import md5 except ImportError: from md5 import md5 realm = 'trac' # build the options usage = "usage: %prog [options]" parser = OptionParser(usage=usage) parser.add_option("-u", "--username",action="store", dest="username", type = "string", help="the username for whom to generate a password") parser.add_option("-p", "--password",action="store", dest="password", type = "string", help="the password to use") parser.add_option("-r", "--realm",action="store", dest="realm", type = "string", help="the realm in which to create the digest") (options, args) = parser.parse_args() # check options if (options.username is None) or (options.password is None): parser.error("You must supply both the username and password") if (options.realm is not None): realm = options.realm # Generate the string to enter into the htdigest file kd = lambda x: md5(':'.join(x)).hexdigest() print ':'.join((options.username, realm, kd([options.username, realm, options.password]))) |
위 소스를 trac-digest.py 로 저장한다. 그리고 다음과 같이 실행해 준다.
1 |
]# python trac-digest.py -u admin -p 14321 -r LocalProject > /home/Trac/LocalProject/users.htdigest |
AccountManager 플러그인을 활성하고 이를 이용해서 이 인증 방법을 지정해준다. 다음과 같이 trac.ini 설정 파일을 편집해 준다.
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 |
[components] acct_mgr.admin.accountmanageradminpanel = enabled acct_mgr.api.accountmanager = enabled acct_mgr.htfile.htdigeststore = enabled acct_mgr.macros.accountmanagerwikimacros = enabled acct_mgr.notification.accountchangelistener = enabled acct_mgr.notification.accountchangenotificationadminpanel = enabled acct_mgr.pwhash.htdigesthashmethod = enabled acct_mgr.register.basiccheck = enabled acct_mgr.register.bottrapcheck = enabled acct_mgr.register.emailcheck = enabled acct_mgr.register.emailverificationmodule = enabled acct_mgr.register.regexpcheck = enabled acct_mgr.register.registrationmodule = enabled acct_mgr.register.usernamepermcheck = enabled acct_mgr.web_ui.accountmodule = enabled acct_mgr.web_ui.loginmodule = enabled acct_mgr.web_ui.resetpwstore = enabled trac.web.auth.loginmodule = disabled tracopt.versioncontrol.git.* = enabled tractoc.macro.tocmacro = enabled [account-manager] account_changes_notify_addresses = htdigest_file = /home/Trac/LocalProject/users.htdigest htdigest_realm = LocalProject password_store = HtDigestStore |
Trac 실행은 먼저 다음과 같이 CLI 로 할 수 있다.
1 |
]# tracd --port 9000 /home/Trac/LocalProject |
CentOS 7, Ubuntu 16.04 LTS 는 Systemd 가 기본이다. 시스템 부팅 프로세스에 등록하기 위해서 systemd 스크립트를 다음과 같이 작성해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
]# vim /etc/systemd/system/trac.service [Unit] Description=Trac Wiki daemon After=syslog.target network.target [Service] Type=forking RuntimeDirectory=tracd StandardOutput=syslog StandardError=syslog SyslogIdentifier=tracd PIDFile=/var/run/tracd/tracd.pid EnvironmentFile=/etc/default/tracd ExecStart=/usr/bin/tracd $DAEMON_ARGS ExecReload=/bin/kill -s SIGHUP $MAINPID User=trac Group=trac KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target Alias=tracd.service |
/etc/default/tracd 파일에 다음과 같이 프로젝트 정보를 기술해 준다.
1 2 |
# trac option DAEMON_ARGS="--daemonize --port 8000 /home/Trac/LocalProject --pidfile=/var/run/tracd/tracd.pid" |
이제 다음과 같이 systemd 스크립트 활성화 하고 시작해준다.
1 2 |
]# systemctl enable tracd ]# systemctl start tracd |
이렇게 한 후 서버에 8000 포트로 접속해서 “LocalProject” 프로젝트 리스트가 나오면 정상이다.
그리고 로그인을 할때에 앞서 설정한 계정과 비밀번호로 로그인을 하면 된다.
윗자리에 있는 사람은 고독한 법, 전략적 사고에 뛰어나며 매우 극소수인 건축가형 사람은 이를 누구보다 뼈저리게 이해합니다. 전체 인구의 2%에 해당하는 이들은 유독 여성에게서는 더욱 찾아보기 힘든 유형으로, 인구의 단 0.8%를 차지합니다. 체스를 두는 듯한 정확하고 계산된 움직임과 풍부한 지식을 소유하고 있는 이들은 그들과 견줄 만한 비슷한 부류의 사람을 찾는 데 종종 어려움을 겪습니다. 건축가형 사람은 상상력이 풍부하면서도 결단력이 있으며, 야망이 있지만 대외적으로 표현하지 않으며, 놀랄 만큼 호기심이 많지만 쓸데없는 데 에너지를 낭비하는 법이 없습니다.
이들의 지식을 향한 갈증은 어릴 적부터 두드러지게 나타나는데, 때문에 건축가형 사람은 어릴 때 ‘책벌레’라는 소리를 자주 듣습니다. 대개 친구들 사이에서는 놀림의 표현임에도 불구하고 전혀 개의치 않아 하며, 오히려 깊고 넓은 지식을 가지고 있는 그들 자신에게 남다른 자부심을 느낍니다. 이들은 또한 관심 있는 특정 분야에 대한 그들의 방대한 지식을 다른 이들과 공유하고 싶어 하기도 합니다. 반면, 일명 가십거리와 같이 별 볼 일 없는 주제에 대한 잡담거리보다는 그들 나름의 분야에서 용의주도하게 전략을 세우거나 이를 실행해 옮기는 일을 선호합니다.
대부분 사람 누가 봐도 이들은 지극히 모순적인 삶을 살아가는 것처럼 보이지만 이를 객관적이고 이성적으로 놓고 보면 사실 이해가 가기도 합니다. 예를 들면, 이들은 비현실적일 만큼 이상주의자이자인 동시에 매우 신랄한 조롱과 비판을 일삼는 냉소주의자로 이 둘이 같이 공존한다는 것 자체가 불가능해 보입니다. 또한, 기본적으로 지혜와 노력, 그리고 신중함만 있으며 못할 것이 없다고 믿는 한편, 사람들이 실질적으로 그러한 성취를 끌어내는 데 있어서는 게으르고 근시안적이며 자기 잇속만 차린다고 생각합니다. 그렇다고 이러한 냉소적인 태도가 성취하고자 하는 이들의 욕구를 꺾지는 못합니다.
확신에 찬 자신감과 함부로 범접할 수 없는 신비로운 아우라를 발산하는 건축가형 사람은 통찰력과 관찰력, 기발한 아이디어, 그리고 뛰어난 논리력에 강한 의지와 인격이 합쳐져 변화를 이끄는 데 앞장섭니다. 이따금 이들이 생각했던 아이디어나 계획을 뒤집고 재수립하는 과정을 거쳐 완벽함을 추구하고자 하거나 도덕적 잣대에 따라 재정비하는 시간을 가지기도 합니다. 건축가형 사람의 업무 스타일을 좇아오지 못하거나 심지어는 이들이 왜 그렇게 행동하는지 전혀 감을 잡지 못하는 사람은 단번에 신임을 잃거나 이들의 인정을 받지 못할 수도 있습니다.
건축가형 사람이 몸서리치게 싫어하는 것이 있다면 바로 질서, 한계, 그리고 전통과 같은 것들인데, 이들은 세상의 모든 것을 탐구와 발견의 대상으로 여기기 때문입니다. 만일 문제 해결을 위한 방안을 찾은 경우, 간혹 무모할 수 있으나 기술적으로 뛰어나며 언제나 그렇듯 비정통적인 기발한 방법이나 아이디어를 수립하기 위해 홀로 행동에 옮깁니다.
그렇다고 이들이 충동적이라는 말은 아닙니다. 얼마나 간절히 성취하기를 원하는지 상관없이 건축가형 사람은 기본적으로 이성적인 사고를 합니다. 내부에서 비롯되었든 아니면 외부 세계에서 기인하였든지, 매사 이들의 아이디어는 “실현 가능할까?”와 같은 ‘이성적 사고’라는 필터의 과정을 거칩니다. 이는 사람 혹은 아이디어에 항시 적용되는 기제로, 이 때문에 건축가형 사람은 종종 곤경에 빠지기도 합니다.
오랜 시간 방대한 지식을 쌓아 온 똑똑하고 자신감 넘치는 이들이지만, 인간관계만큼은 이들이 자신 있어 하는 분야가 아닙니다. 진리나 깊이 있는 지식을 좇는 이들에게 선의의 거짓말이나 가벼운 잡담은 그저 낯설기만 합니다. 그럼에도 불구하고 자신을 필요 이상으로 내몰아 부조리투성이인 사회적 관습을 경험하기도 합니다. 가장 좋은 것은 이들이 그들 자신 자체로 온전히 있을 수 있는 곳, 즉 스포트라이트 밖에 있는 것입니다. 건축가형 사람은 익숙하고 편안한 곳에서 본연의 모습으로 있을 때 비로소 연인 관계나 그 외 여러 상황에서 그들 나름의 빛을 발하며 사람들을 끌어들이기 때문입니다.
건축가형 사람의 성향을 정의하자면 이들은 인생을 마치 체스를 두듯이 새로운 계획이나 전술, 그리고 대책을 세워가며 상대방 머리 위에서 수를 두며 허를 찌르는 기술로 상황을 유리하게 몰고 가는 듯한 삶을 살아갑니다. 그렇다고 이들이 양심 없는 삶을 살아간다는 말은 아닙니다. 다만 감정에 치우치는 것을 싫어하는 이들의 성격상 타인의 눈에 그렇게 비추어질 수 있습니다. 이를 고려하면 왜 많은 허구 속 등장인물들(종종 오해를 받곤 하는 영화 속 영웅들)이 본 성격 유형으로 묘사되는지 이해할 수 있을 것입니다.
이 문서는 php7.2 설치 문서 입니다.
CentOS 가 최소설치되었다고 가정하고 시작했기 때문에 컴파일 환경을 구축해야 합니다.
1 2 3 |
yum update -y reboot yum install gcc.x86_64 gcc-c++.x86_64 wget.x86_64 bzip2-devel.x86_64 pkgconfig.x86_64 openssl-devel.x86_64 make.x86_64 man.x86_64 nasm.x86_64 gmp.x86_64 gmp-devel.x86_64 curl-devel.x86_64 libicu-devel.x86_64 libsodium-devel.x86_64 gdbm-devel.x86_64 readline-devel.x86_64 compat-readline43.x86_64 ncurses-devel.x86_64 db4-devel.x86_64 automake* autoconf* -y |
Ubuntu16.04 의 경우에는 다음과 같은 프로그램이 설치되어 있어야 합니다.
1 2 3 4 5 |
apt clean all apt update apt install build-essential libsystemd-dev pkg-config libxml2-dev libssl-dev libbz2-dev \ libcurl3 libcurl4-openssl-dev libsodium-dev libjpeg9-dev libpng-dev \ libfreetype6-dev libxpm-dev libgmp10-dev libxslt1-dev |
최신버전을 다운로드 받아야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
]# wget http://jp2.php.net/get/php-7.2.1.tar.bz2/from/this/mirror --2018-01-07 00:17:28-- http://jp2.php.net/get/php-7.2.1.tar.bz2/from/this/mirror Resolving jp2.php.net... 49.212.134.217 Connecting to jp2.php.net|49.212.134.217|:80... connected. HTTP request sent, awaiting response... 302 Found Location: http://jp2.php.net/distributions/php-7.2.1.tar.bz2 [following] --2018-01-07 00:17:29-- http://jp2.php.net/distributions/php-7.2.1.tar.bz2 Connecting to jp2.php.net|49.212.134.217|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 14980278 (14M) [application/octet-stream] Saving to: `mirror' 100%[===================================================================================>] 14,980,278 6.55M/s in 2.2s 2018-01-07 00:17:31 (6.55 MB/s) - `mirror' saved [14980278/14980278] ]# tar xvjf mirror |
이제 PHP에서 사용할 기능들을 결정해야 합니다. PHP에서 제공하는 기능은 아주 많지만 여기서는 다음과 같은 기능들을 사용할 것입니다.
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 |
../configure --prefix=/opt/php-7.2.1 \ --with-config-file-path=/opt/php-7.2.1/etc \ --with-config-file-scan-dir=/opt/php-7.2.1/etc/conf.d \ --with-libdir=lib64 \ --enable-fpm \ --with-fpm-systemd \ --enable-sockets \ --with-gettext \ --with-mhash \ --with-gmp \ --with-gd \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-freetype-dir=/usr \ --enable-bcmath \ --enable-exif \ --with-zlib \ --with-bz2 \ --enable-calendar \ --enable-mbstring \ --with-mhash \ --enable-intl \ --with-xsl \ --with-sodium \ --with-libxml-dir=/usr \ --with-curl \ --disable-debug \ --with-openssl \ --enable-mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --enable-inline-optimization \ --enable-sysvmsg \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-pcntl \ --enable-mbregex \ --with-mhash \ --enable-zip \ --with-pcre-regex |
아무런 에러없이 끝났다면 다음과 같이 컴파일을 해주고 설치해준다.
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 |
]# make ]# make install Installing shared extensions: /opt/php-7.2.1/lib/php/extensions/no-debug-non-zts-20170718/ Installing PHP CLI binary: /opt/php-7.2.1/bin/ Installing PHP CLI man page: /opt/php-7.2.1/php/man/man1/ Installing PHP FPM binary: /opt/php-7.2.1/sbin/ Installing PHP FPM defconfig: /opt/php-7.2.1/etc/ Installing PHP FPM man page: /opt/php-7.2.1/php/man/man8/ Installing PHP FPM status page: /opt/php-7.2.1/php/php/fpm/ Installing phpdbg binary: /opt/php-7.2.1/bin/ Installing phpdbg man page: /opt/php-7.2.1/php/man/man1/ Installing PHP CGI binary: /opt/php-7.2.1/bin/ Installing PHP CGI man page: /opt/php-7.2.1/php/man/man1/ Installing build environment: /opt/php-7.2.1/lib/php/build/ Installing header files: /opt/php-7.2.1/include/php/ Installing helper programs: /opt/php-7.2.1/bin/ program: phpize program: php-config Installing man pages: /opt/php-7.2.1/php/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment: /opt/php-7.2.1/lib/php/ [PEAR] Archive_Tar - installed: 1.4.3 [PEAR] Console_Getopt - installed: 1.4.1 [PEAR] Structures_Graph- installed: 1.1.1 [PEAR] XML_Util - installed: 1.4.2 [PEAR] PEAR - installed: 1.10.5 Wrote PEAR system config file at: /opt/php-7.2.1/etc/pear.conf You may want to add: /opt/php-7.2.1/lib/php to your php.ini include_path /root/php-7.2.1/build/shtool install -c ext/phar/phar.phar /opt/php-7.2.1/bin ln -s -f phar.phar /opt/php-7.2.1/bin/phar Installing PDO headers: /opt/php-7.2.1/include/php/ext/pdo/ |
config-file-scan 디렉토리를 생성해 준다.
1 |
]# mkdir /opt/php-7.2.1/etc/conf.d |
그리고 php.ini 파일을 /opt/php-7.2.1/etc 디렉토리로 복사해준다.
1 |
]# cp php.ini-production /opt/php-7.2.1/etc/php.ini |
그리고 다음과 같이 php-fpm 을 위한 설정 파일도 만들어 준다. 이것은 php-fpm.conf.default 파일을 php-fpm.conf 파일로 복사해주고 다음과 같이 설정해 주면 된다.
1 2 3 4 5 |
pid = run/php-fpm.pid error_log = log/php-fpm.log include=/opt/php-7.2.1/etc/php-fpm.d/*.conf |
그리고 pool 을 php-fpm.d 디렉토리에 설정해 준다. 보통 기본으로 www.conf 가 있는데 이것을 활요하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[www] prefix = /home/php/www user = nobody group = nogroup listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1 pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 rlimit_files = 131072 rlimit_core = unlimited chdir = / |
위 설정은 각 서버 환경에 맞춰 해줘야 한다. 얼마나 사용자를 받느냐에 따라서 pm 값을 달리 해줘야 한다.
마지막으로 다음과 같이 systemd 를 위한 서비스 파일을 다음과 같이 작성해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=PHP FastCGI process manager After=local-fs.target network.target nginx.service [Service] PIDFile=/opt/php-7.2.1/var/run/php-fpm.pid ExecStart=/opt/php-7.2.1/sbin/php-fpm --fpm-config /opt/php-7.2.1/etc/php-fpm.conf --nodaemonize Type=simple [Install] WantedBy=multi-user.target |
위 내용을 php-fpm.service 파일로 /etc/systemd/system 디렉토리에 작성해 주고 systemd 에 등록해준다.
php-fpm 이 잘 동작하는지 확인 하는 방법으로 cgi-fcgi 명령어를 활용하는 법이 있다. 이 명령어는 php-fpm 처럼 FastCGI 로 동작하는 서버에 직접 연결을 할 수 있게 해준다.
php 정보를 표시해줄 파일을 작성하고 다음과 같이 cgi-fcgi 를 사용해 본다.
1 2 3 4 5 |
]$ SCRIPT_FILENAME=/home/php/www/index.php \ REQUEST_URI=/ \ QUERY_STRING= \ REQUEST_METHOD=GET \ ]$ cgi-fcgi -bind -connect 127.0.0.1:9000 |
index.php 파일에는 ‘phpinfo();’ 를 호출해 php 설치에 관한 정보를 출력하도록 했으며 각종 파라메터를 쉘 환경변수에 지정해서 cgi-fcgi 로 전달해준다.
서버를 다루다보면 Python, SaltStack 을 작성해야 하는데 이를 위해서 윈도우즈로 다운로드 받아서 편집기를 열어서 하기가 영 귀찮습니다. 터미널을 이용해기 때문에 vim 를 이용하면 아주 편한데, 이 문서는 Python, SaltStack 편집을 위한 vim 세팅 위한 것입니다.
환경이 중요합니다. 이 문서의 환경은 다음과 같습니다.
Vundle 은 vim 플러그인 입니다. 이 플러그인은 vim 의 각종 플러그인을 아주 편하게 설치 및 관리를 해주는 플러그인 매니저 입니다.
다음과 같이 설치 해줍니다.
1 2 3 4 5 6 7 |
(saltenv) systemv@wlserv1:~/.vim/bundle$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim Cloning into '/home/systemv/.vim/bundle/Vundle.vim'... remote: Counting objects: 3128, done. remote: Total 3128 (delta 0), reused 0 (delta 0), pack-reused 3128 Receiving objects: 100% (3128/3128), 931.68 KiB | 638.00 KiB/s, done. Resolving deltas: 100% (1101/1101), done. Checking connectivity... done. |
git 를 이용해서 Vundle 플러그인 매니저 파일을 vim 디렉토리에 다운로드 받습니다.
이제 vim 의 환경설정 파일을 다음과 같이 작성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
syntax on set nocompatible set hls set scs set visualbell set ignorecase set showmatch filetype off set fileencodings=utf-8 set termencoding=utf-8 set encoding=utf-8 set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'gmarik/Vundle.vim' call vundle#end() filetype plugin indent on " required! |
위와같이 작성한 후에 vim 을 실행해 명령어 모드에서 다음과 같이 입력해줍니다.
1 2 |
# vim 을 열어서 commmand mod 에서 :PluginInstall |
이 플러그인은 코드 스냅피를 지원해줍니다. vim 설정 파일에서 Vundle 블럭 사이에 다음을 추가해줍니다.
1 2 3 |
Plugin 'Shougo/neocomplete' Plugin 'Shougo/neosnippet' Plugin 'Shougo/neosnippet-snippets' |
시스템 버퍼에 있는 키워드를 완성해 줍니다.
awesome Python autocompletion with VIM
Python 을 위한 자동완성 플러그인 입니다. 이는 jedi 라는 파이썬 라이브리를 설치해줘야 합니다. Python 은 가상환경을 사용하기 때문에 가상환경를 이용해서 설치해줍니다.
1 2 3 4 5 6 |
(saltenv) systemv@wlserv1:~$ pip install jedi Collecting jedi Downloading jedi-0.10.2-py2.py3-none-any.whl (190kB) 100% |████████████████████████████████| 194kB 1.4MB/s Installing collected packages: jedi Successfully installed jedi-0.10.2 |
이제 jedi-vim 를 설치해줍니다. 역시 Vundle 를 이용해서 설치 합니다.
1 |
Bundle 'davidhalter/jedi-vim' |
vim 를 사용하면서 각종 필요한 정보를 화면 아래에 상태바로 보여 줍니다.
1 |
Bundle 'https://github.com/Lokaltog/vim-powerline.git' |
다음과 같이 vim 설정을 해줍니다.
1 2 3 4 5 |
" powerline language en_US.UTF-8 let g:Powerline_symbols = 'fancy' "set guifont=DejaVu\ Sans\ Mono\ for\ Powerline\ 9 set laststatus=2 |
이제 Python 문법 체크를 위해서는 먼저 파이썬 문법체크 라이브러리를 설치해 줍니다. 역시 가상환경에서 설치 해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
(saltenv) systemv@wlserv1:~$ pip install pep8 pyflakes Collecting pep8 Downloading pep8-1.7.0-py2.py3-none-any.whl (41kB) 100% |████████████████████████████████| 51kB 784kB/s Collecting pyflakes Downloading pyflakes-1.6.0-py2.py3-none-any.whl (227kB) 100% |████████████████████████████████| 235kB 3.2MB/s Installing collected packages: pep8, pyflakes Successfully installed pep8-1.7.0 pyflakes-1.6.0 (saltenv) systemv@wlserv1:~$ pip install autopep8 Collecting autopep8 Downloading autopep8-1.3.2-py2.py3-none-any.whl (42kB) 100% |████████████████████████████████| 51kB 863kB/s Collecting pycodestyle>=2.3 (from autopep8) Downloading pycodestyle-2.3.1-py2.py3-none-any.whl (45kB) 100% |████████████████████████████████| 51kB 3.0MB/s Installing collected packages: pycodestyle, autopep8 Successfully installed autopep8-1.3.2 pycodestyle-2.3.1 |
pep8, pyflakes를 문법 체크를 위한 라이브러리이며 autopep8 은 vim 플러그인에서 사용하기 위한 의존성 패키지 입니다. 이는 잘못된 문법을 자동으로 고쳐줍니다.
이제 vim 플러그인을 설치해 줍니다.
1 |
Plugin 'Syntastic' |
그리고 vim 설정에 다음과 같이 입력해 줍니다.
1 2 3 4 5 6 7 8 |
let g:syntastic_python_checkers = [ 'pep8' ] "let g:syntastic_python_checkers = [ 'flake8' ] let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 syntax on |
Python 문법 체크를 위해서 Autopep8 을 사용하는데 이를 vim 에서 사용할 수 있도록 도와주는 플러그인을 설치합니다.
1 2 3 4 5 6 7 8 |
saltenv) systemv@wlserv1:~/.vim$ git clone https://github.com/tell-k/vim-autopep8.git Cloning into 'vim-autopep8'... remote: Counting objects: 208, done. remote: Total 208 (delta 0), reused 0 (delta 0), pack-reused 208 Receiving objects: 100% (208/208), 35.91 KiB | 0 bytes/s, done. Resolving deltas: 100% (92/92), done. Checking connectivity... done. (saltenv) systemv@wlserv1:~/.vim$ mv vim-autopep8/* . |
위와같이 하면 ftplugin 디렉토리에 python_autopep8.vim 파일이 생성 됩니다.
python 을 위한 설정으로 다음과 같이 python.vim 파일을 작성해 ftplugin 디렉토리에 넣어둡니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
set autoindent set tabstop=4 set softtabstop=4 set shiftwidth=4 set textwidth=100 set expandtab set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class set nocindent set showmatch set nu set ruler au FileType py set autoindent au FileType py set smartindent au FileType py set textwidth=79 let python_version_2 = 1 " python 2 문법을 따른다고 옵션을 설정합니다. let python_highlight_all = 1 " 모든 강조(색상) 기능을 켭니다. " autopep8 let g:autopep8_max_line_length=79 let g:autopep8_indent_size=4 let g:autopep8_disable_show_diff=1 |
위 파일은 python 파일 타입에 한해서 vim 설정을 적용해 줍니다.
다음과 같이 아주 간단히 설정을 할수 있습니다.
1 2 3 |
git clone https://github.com/saltstack/salt-vim.git cd salt-vim && \ cp -r ftdetect ftplugin syntax ~/.vim/ |
최종 .vimrc 파일 내용
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 46 47 |
syntax on set nocompatible set hls set scs set visualbell set ignorecase set showmatch filetype off set fileencodings=utf-8 set termencoding=utf-8 set encoding=utf-8 set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'gmarik/Vundle.vim' Plugin 'Shougo/neocomplete' Plugin 'Shougo/neosnippet' Plugin 'Shougo/neosnippet-snippets' Plugin 'Syntastic' Plugin 'vim-addon-manager' Bundle 'davidhalter/jedi-vim' Bundle 'https://github.com/Lokaltog/vim-powerline.git' call vundle#end() filetype plugin indent on " required! let g:syntastic_python_checkers = [ 'pep8' ] "let g:syntastic_python_checkers = [ 'flake8' ] let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 let g:autopep8_disable_show_diff=1 syntax on " powerline "language en_US.UTF-8 let g:Powerline_symbols = 'fancy' set guifont=DejaVu\ Sans\ Mono\ for\ Powerline\ 9 set laststatus=2 |
시스템을 운영하다 보면 Python 을 많이 사용하게 되는데, 리눅스 시스템의 경우에 기본적으로 Python 이 설치되어 있다. 하지만 pip 는 기본적으로 설치되지 않는데 이것을 설처하기 위해서 리눅스 시스템의 슈퍼유저인 root 사용자 계정을 빌리거나 설치 요청을 하는 경우가 많다.
하지만 일반계정으로 pip 를 사용할 수 있는데 이에 대해 간단히 소개한다.
일반계정일 경우에 홈디렉토리에 bin 디렉토리를 생성하고 PATH 쉘 변수를 설정하면 되는데 이럴경우 홈디렉토리에 노출되는데 이를 숨기기 위해서 숨김 디렉토리로 설정한다.
1 2 3 |
~$ mkdir -p ~/.local/bin ~$ echo "export PATH=\$PATH:~/.local/bin" >> .bashrc ~$ source .bashrc |
숨김 디렉토리를 생성한 후에 PATH 쉘 변수를 만들고 Bash 환경파일에 기록한 후에 적용해 준다.
이제 일반계정으로 pip 설치를 위해 get-pip.py 를 다운받아 다음과 같이 설치 한다.
1 |
~$ wget https://bootstrap.pypa.io/get-pip.py |
그리고 다음과 같이 설치한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
~$ python3 get-pip.py --user Collecting pip Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB) 100% |████████████████████████████████| 1.3MB 1.3MB/s Collecting setuptools Downloading setuptools-36.4.0-py2.py3-none-any.whl (478kB) 100% |████████████████████████████████| 481kB 1.3MB/s Collecting wheel Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB) 100% |████████████████████████████████| 51kB 10.5MB/s Installing collected packages: pip, setuptools, wheel Successfully installed pip-9.0.1 setuptools-36.4.0 wheel-0.30.0 ~$ |
핵심은 –user 옵션이다.
이렇게 하면 pip 관련된 파일들이 ~/.local/bin 디렉토리에 생성된다. 관련 라이브러리들도 ~/.local/lib 함께 생성된다.
pip 를 이용해 패키지를 설치할때도 역시 다음과 같이 –user 옵션을 이용한다.
1 |
~$ pip install salt-ssh --user |