| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
크게 3단계로 작업을 진행할 예정이다.
1편 - 라즈베리파이4를 서버로 만들기
2편 - 웹 어플리케이션 배포
3편 - 도커라이징
재료 준비 및 시작
1.0. 구입한 제품들
1.1. 전원 연결
1.2. 안전하게 종료하기
OS 설치
2.0. Raspbian 설치 방법 선택
2.1. Raspbian 이미지 다운로드
2.2. SD카드에 Raspbian 이미지 굽기
2.3. 라즈베리파이에 OS 설치
기본 환경 설정
3.0. 설정 도구 실행
3.1. 비밀번호 변경
3.2. Locale 설정
3.3. Timezone 설정
3.4. Keyboard Layout 설정
3.5. Wi-fi Country 설정
3.6. Wi-fi 설정 (raspi-config 사용)
3.7. Wi-fi 설정 (wpa_passphrase 사용)
3.8. SSH 허용 및 접속
3.9. Hostname, Wi-fi 설정
네트워크 설정
4.0. 내부IP 고정
4.1. DDNS 설정
4.2. 포트포워딩 설정
4.3. ipTIME 원격접속 허용
Nginx 설치 및 설정
5.0. Nginx 설치
5.1. 한글 폰트 및 입력기 설치
5.2 Nginx 문자셋 설정
도메인, SSL 설정
6.0. 도메인 구입
6.1. 도메인 연결
6.2. SSL 인증서 생성 및 적용
6.3. SSL 인증서 자동갱신 설정
기타
7.0. 온도 측정용 쉘 스크립트 작성
구입할 당시에 한국에 라즈베리파이4 판매처가 아예 없어서, 미국에 사는 처남에게 부탁해서 제품을 구매했다.
구글링을 꽤 해보고 리뷰들도 읽어 본 후에 구매한 제품들이지만, 최고의 선택이 아닐 수도 있다.
(제품 홍보 절대 아님!)
라즈베리파이 보드를 케이스와 결합
쿨링팬을 라즈베리파이 보드의 GPIO에 연결
전원을 연결하면 빨간불과 녹색불이 켜지고, 팬이 돌아간다.
다른 선택지들도 있지만, 첫 경험이므로 얌전하게 공식 OS인 Raspbian을 설치한다.
나의 경우 설치하려는 OS와 설치 목적이 분명하므로 2번 방법으로 설치를 진행했다.
Raspbian Lite 버전을 기준으로 서버로 활용하기 위한 기본 환경을 설정한다.
(주의) 반드시 변경해야 되는 것은 아니다.
변경할 경우 /etc/wpa_supplicant/wpa_supplicant.conf 파일에 country={국가코드}가 작성되는데,
이것이 없어야만 무선 네트워크가 검색되는 경우도 있다고 한다.
와이파이를 raspi-config로 설정하는 방법과 wpa_passphrase로 설정하는 방법이 있다.
raspi-config로 와이파이 설정 시, password가 설정 파일(/etc/wpa_supplicant/wpa_supplicant.conf)에 그대로 노출된다.
비밀번호를 암호화하기 위해서는 raspi-config 대신 wpa_passphrase 명령으로 와이파이를 설정하는 것이 좋다.
$ wpa_passphrase {SSID} {비밀번호} 명령을 치면, network 정보가 아래와 같이 콘솔에 출력된다.
network={
ssid="KT_GiGA_5G_HOME"
#psk="{비밀번호}"
psk=7ac0c35da93c82d ....(생략)
}
출력된 network 정보를 설정 파일(/etc/wpa_supplicant/wpa_supplicant.conf)에 추가한다.
$ sudo su # root 권한으로 변경
$ wpa_passphrase {SSID} {비밀번호} >> /etc/wpa_supplicant/wpa_supplicant.confwpa_supplicant.conf 파일은 아래와 같다.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="KT_GiGA_5G_HOME"
#psk="{비밀번호}"
psk=7ac0c35da93c82d ....(생략)
}시력 보호를 위해 라즈베리파이에 SSH로 원격 접속해서 사용하는 것이 훨씬 편리하다.
SSH 접속을 허용하면 라즈베리파이에 모니터와 키보드를 연결할 필요 없이,
PC/랩탑에서 SSH를 통해 라즈베리파이에 접속하면 된다. (마치 AWS EC2 인스턴스가 내 책상에..)
이 부분은 사용하는 공유기에 따라 설정 방법이 다르다.
ipTIME A3004NS-M 모델 (펌웨어 버전 11.00.4) 기준으로 작성했다.
공유기를 통해 wi-fi를 사용하는 기기들에게 공유기는 임의로 내부IP(사설IP)를 할당한다.
기기를 wi-fi에 연결한 순서에 따라, 맥북은 192.168.0.2, 휴대폰은 192.168.0.3, 라즈베리파이는 192.168.0.4 이런식이다.
그런데 공유기에 전원이 차단되어 공유기가 재부팅되는 경우 등으로 인해 내부 IP 설정이 초기화 될 수 있다.
이런 상황을 대비해서 내부 IP를 공유기 내에서 고정시키는 것이 좋다.
ipTIME 접속 (192.168.0.1)
고급설정 - 네트워크 관리 - DHCP 서버 설정
하단에 [사용중인 IP 주소 정보] 중 라즈베리파이의 체크박스를 클릭하고 위에 등록 버튼 클릭.
ISP 사업자(KT, SKT 등)는 DHCP(동적 호스트를 제공하는 프로토콜)를 통해 가정집에 유동 IP를 할당해준다.
유동IP라도 IP가 자주 바뀌지는 않는다.
하지만 ISP 사업자가 DHCP 서버를 리셋하는 등의 수작을 부리면 우리집에 할당되었던 IP가 변경된다.
이 경우 DNS에 등록한 A 레코드(IP주소)가 변경된 것이기 때문에, A 레코드를 새로운 IP로 변경하여 도메인이 새 IP를 바라보게 해야한다.그런데 DDNS 서비스를 사용하면 A레코드의 변경을 감지해서 자동으로 업데이트 해주기 때문에,
IP 변경에 신경 쓸 필요없이 고정IP 처럼 사용할 수 있다.편리하게도 ipTIME에서 자체 DDNS 서비스를 제공한다.
구입한 도메인의 CNAME(혹은 ANAME, 혹은 Alias)으로 ipTIME DDNS를 등록해서 고정IP 처럼 사용할 예정이다.
외부에서 라즈베리파이의 IP 혹은 도메인과 지정된 포트로 접근했을 때, 연결시킬 내부 포트 설정
참고 : http의 기본 포트가 80, https의 기본 포트가 443인 이유는 무엇일까?
한글 폰트와 문자셋 설정은 당장 필요하지 않지만 해두었다.
charset utf-8;
server {
charset utf-8;
}
블로그 도메인을 Godaddy에서 구입했었는데, 비싸다.
구글링 결과 Namecheap의 평가가 훨씬 좋아서 선택했다.
그리고 Godaddy는 ANAME이나 Alias를 제공하지 않아서 기존에 있던 도메인도 Namecheap으로 이전했다.
이 부분에서 삽질을 많이 했다. 아래에 삽질 과정을 요약했다.
ipTIME에서 설정한 DDNS 도메인(go-quality.iptime.org)을 구입한 도메인(go-quality.dev)의 CNAME으로 등록해서 고정IP 처럼 사용하려 했다.
하지만 정상적으로 접속되지 않았다.
go-quality.iptime.org는 서브 도메인(e.g. www)이 없는 Root domain인데, Root domain은 서브 도메인이 없으므로 CNAME 등록하면서 Host 부분에 와일드카드(* 또는 @)를 사용하면 된다고 생각했다.
알아보니 Root domain은 CNAME으로 설정하지 않는 것이 표준(RFC 1912, RFC 2181) 이었다.
이 표준은 기술적인 제약은 아니고 Contractual 제약인데, Namecheap이나 Godaddy에서는 표준을 따르고 있었다.
그래서 서브도메인이 없는 Root domain을 CNAME으로 등록하는 방법을 구글링하다보니 ANAME, ALIAS 등의 방법을 제공하는 업체들이 있었다.
Godaddy에서는 ANAME도 ALIAS도 제공하지 않았는데, 다행히 Namecheap에서는 ALIAS를 사용해서 CNAME 처럼 등록할 수 있었다.
하지만 또 다시 정상적으로 접속되지 않았다.
알아보니 .dev 도메인은 https 접속이 default인데, SSL 인증서를 세팅하지 않은 것이다.
우선 Alias로 등록한 Root domain이 CNAME 처럼 등록되었는지 먼저 테스트를 해보고 SSL 인증서를 세팅하기로 했다.
테스트를 위해 Godaddy에 등록된 도메인 중 www.놀고있던도메인.com을 Namecheap으로 옮겼다.
그리고 www.놀고있던도메인.com 도메인에 go-quality.iptime.org를 ALIAS로 설정했더니, CNAME 처럼 등록되었다.
Alias 설정 후, www.놀고있던도메인.com 으로 접근하니 go-quality.iptime.org에 띄워둔 Nginx 랜딩페이지를 볼 수 있었다. (Alias 테스트 성공)
그 이후, SSL을 설정하고 go-quality.dev로 접근하니 아래 처럼 라즈베리파이에 실행중인 Nginx 랜딩페이지가 나타났다. (도메인 연결 성공)
Let's Encrypt를 사용해서 무료로 SSL 인증서를 세팅해본다.
Let's Encrypt는 "전 세계 모든 사이트를 HTTPS로 만들기!” 라는 슬로건으로 시작 된 오픈소스 프로젝트이다.
3개월마다 인증서를 갱신해야 하지만, 자동화할 수 있으니 문제없다.
실행중인 Nginx 종료
라즈베리파이에 letsencrypt를 설치한다.
인증서 생성
인증서 생성 결과 확인
Nginx에 인증서 적용
Nginx 설정 파일(/etc/nginx/nginx.conf)의 http{ ... } 안에 아래 내용을 추가한다.
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/{도메인명}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{도메인명}/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
}Nginx 시작 및 포트확인
SSL 적용 확인
참고 : LETSENCRYPT 에서 SSL 인증서를 무료로 발급 받아 웹 서버에 적용하기
30일 마다 라즈베리파이에 접속해서 $ certbot renew를 입력하는 것은 귀찮다.
Crontab으로 인증서 갱신을 자동화 한다.
인증서 만료일 확인
시스템 시간 확인
기존에 설정된 Crontab 확인
Crontab 편집
$ sudo crontab -e
아래 내용 추가 후 저장
# 매월 1일 새벽4시에 $ certbot renew 명령을 내리고, 갱신에 성공하면 nginx reload
0 04 1 * * /usr/bin/certbot renew --renew-hook="sudo systemctl reload nginx"Crontab 실행 로그 확인
참고
#!/bin/bash
cpuTemp=$(cat /sys/class/thermal/thermal_zone0/temp)
cpuTemp1=$(($cpuTemp/1000))
cpuTemp2=$(($cpuTemp/100))
cpuTempM=$(($cpuTemp2 % $cpuTemp1))
gpuTemp=$(/opt/vc/bin/vcgencmd measure_temp)
gpuTemp=${gpuTemp}
gpuTemp=${gpuTemp//temp=/}
echo $(date "+%Y-%m-%d %H:%M")
echo Temperature CPU : $cpuTemp1"."$cpuTempM"'C, GPU : "$gpuTemp참고 : 라즈베리파이 시스템 온도(발열) 확인
처음에 라즈베리파이에 토이프로젝트를 올려야겠다는 생각이 들었을 때는,
솔직히 이렇게 삽질을 많이 하게 될 줄(많은 걸 배우게 될 줄)은 몰랐다.
라즈베리파이 사서, OS 설치하고, wi-fi 연결하고, nginx 설치하고, jar파일 올리고, 도메인 연동하면 끝이라고 생각했던 것이다.
실제로 그게 전부다.
하지만 그 사이사이에, 내가 가진 개발지식의 빈 틈들이 미쳐 날뛰어준 덕분에
내가 이걸 여태 모르고 개발자라고 떠들고 다녔구나.. 라는 아..하.. 모멘트가 쉴 새 없이 휘몰아쳤다.
컴공 전공자들은 대학생때 학교 과제로, 혹은 심심풀이로 만진다는 라즈베리파이를..
나는 뜨거운 쇠공을 굴리듯, 손 댈 때마다 앗 뜨거! 하며, 구글링 삼매경에 빠졌더랜다.
들인 시간 대비 실제로 한 것은 별로 없지만, 이렇게라도 빈 틈을 채울 수 있어서 좋았다.
2편은 Spring boot 어플리케이션을 라즈베리파이에 배포하는 과정을 정리할 예정이고,
3편은 토이프로젝트의 인프라 환경을 도커 기반으로 바꾸는 과정을 정리할 예정이다.
| Back | FazBrowse Home | New Git URL |