[CentOS] Nginx 설치 및 사용 | 규니의 블로그 (hgko1207.github.io)
[CentOS] Nginx 설치 및 사용
1. Nginx 저장소 추가 yum 저장소에는 nginx 라이브러리가 없기 때문에 저장소를 추가합니다. 1[hgko@localhost ~]$ sudo vi /etc/yum.repos.d/nginx.repo /etc/yum.repos.d 경로에 nginx.repo 파일을 추가하고 아래와 같이 작
hgko1207.github.io
리액트는 apache에서 잘 안되나 보다 nginx를 설치해서 사용하자
Nginx로 React를 배포하는 방법 (codechacha.com)
Nginx로 React를 배포하는 방법
React(리액트) 앱을 배포할 때 Nginx, Aphache와 같은 웹서버로 배포를 해야 합니다. Nginx는 오픈소스이며 매우 효율적인 웹서버입니다. 이 글에서 우분투 18.04환경에서 nginx로 React 앱을 배포하는 방법
codechacha.com
포트포워딩과정
httpd.conf를 보면 80번 포트에서 작업하겠다가 적혀있다. 이를 바꾸고 싶다면 서버내에 다른 포트를 뚫어주어야한다.
이때 우리서버에서 데이터를 전송받기 위해서는 두가지 방식이 존재하는데 하나는 UDP이고 다른건 TCP이다. 기본적으로 웹서비스는 TCP 방식을 이용한다.
이때 TCP가 관계를 맺는 3-way handshaking을 알아보면
먼저 client 쪽에서 SYN(0)을 보낸다.
그럼 server 쪽에서 SYN(1)/ACK(0)를 보낸다.
다시 client 쪽에서 ACK(1)를 보낸다.
이때의 TCP의 기능으로
- 재전송 요청가능
- 신뢰성
정도만 있다.
UDP는 신뢰성이 없다. 대신 실시간 전송이 가능하다. 그래서 목소리, 실시간 통신등에 사용하기 좋다.
둘다 전송속도를 보장해주지는 않는다.
그런데 포트번호가 정해져있다면 해커가 세션을 가로채서 들어올 수 있기 떄문에 매우 위험한 방식이다. 그래서 들어올떄는 다른 포트를 사용하고 내부에서 80번 포트로 포트 포워딩을 해주는 것이다.
AWS VPC
AWS VPC(Virtual Private Cloud) -> public 환경안에 개인의 프라이빗 서비스(환경) 제공
이렇게 하면 서로 공간이 달라져 있기 때문에 겹칠일이 없다. 나갈때는 Internet Gateway를 통해서 인터넷으로 빠져나간다.
그런데 그냥 공인 IP를 쓰면 보안상 위험하다. 그래서 공인 IP는 앞에 놓고 뒤쪽 서버는 사설 IP를 쓰면 보완성과 유연함을 높일 수 있다.
WIN10:VMWareWS
client가 서버로 80번 포트를 타고 간다고 하면 NAT에서는 서버로 갈 수 있는 파이프를 만들어준다. 이때 포트포워딩으로 FW 80번으로 들어온 것을 서버의 80번 포트로 연결해준다.
1. SELinux는 편의상 종료한다.
SELinux는 내부 자원에 대한 접근을 제어할 수 있으며 지정되지 않은 경로에 패키지가 설치되는 경우, 디폴트 경로등을 바꾼는 것을 하지 못하게 하는 기능.
setenforce 0
vi /etc/selinux/config
이렇게하면 selinux가 정지된 상태가 된다.
CentOS 방화벽
이번에는 방화벽을 가동해보자
RHEL/CentOS 에서 방화벽(firewall) 설정하기 (lesstif.com)
RHEL/CentOS 에서 방화벽(firewall) 설정하기
포트 추가/변경, IP 추가/변경는 --reload 옵션을 실행해야 반영됨.
www.lesstif.com
systemctl start firewalld #지금실행
systemctl enable firewalld #자동실행
systemctl status firewalld #상태확인
firewall-cmd --zone=public --list-all #열린 포트확인가능
firewall-cmd --list-ports #열린 포트만확인가능
firewall-cmd --reload #firewall 재실행
systemctl restart firewalld #firewall 재실행
active 인걸 확인할 수 있다.
방화벽이 실행된다고 하더라도 SSH연결은 매우 중요하므로 기본적으로 외부에서 연결이 가능하도록 방화벽에서 해당 포트 22번을 허용해둔다.
번외) aws에서 인스턴스를 생성할때 외부로 부터의 접속을 허용하기 위해서는 [Security Group]을 설정한다.
인스턴스 생성시 보안그룹을 구성할때 SSH는 기본으로 구성되어 있다.
그럼 우리도 한번 방화벽의 80번 포트만 열어보자
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8888/tcp
firewall-cmd --reload #이걸 해야 적용된다.
firewall-cmd : 방화벽 구성
--permanent : 재부팅 이후에도 설정 영구적유지
--add-port : 열어놓을 포트
(--add-service : /etc/services를 보면 서비스 이름과 포트번호가 있다.)
=80/tcp : 열어놓은 포트 번호와 열어놓은 방법(tcp 혹은 udp)
systemctl status httpd 로 httpd 서비스를 재실행시키자
vi /etc/httpd/conf/httpd.conf
가서 위와같이 80번 포트가 열려있는 곳에 추가로 8888번 포트도 열어주자.
systemctl restart httpd
systemctl status httpd
으로 웹서비스를 실행시키어주자
그럼 8888번 포트로 접속시 정상접속이 되는 것을 확인할 수 있다.
nginx도 잘작동한다.
이번에는 포트포워딩을 해보자
위와같이 80번으로 들어온걸 8888로 보내주자
nginx가 듣는 포트도 바꾸어 주자
그리고 꼭
```
systemctl restart nginx
```
해주어야 적용된다.
매우잘된다.
외부에서 나한테 접근하기
Quiz. 192.168.8.199에는 SSH가 설치됨. 기본 포트는 22번이지만 이를 변경하여 2222에서 서비스 수행
최종적으로 외부 사용자는 10.5.1.x 20022로 접속하면 192.168.8.199의 2222번포트로 SSH 연결이 가능하도록 설정
밑단에서부터 시작하겠다.
1. ssh 서비스 설정
```
vi /etc/ssh/sshd_config
```
2222번을 열어준다.
```
systemctl restart sshd
```
2. firewall 설정
```
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --list-ports
systemctl restart firewalld
```
3. VMnet8 네트워크 설정
나머지는 윈도우 방화벽을 꺼주면
외부에서 내 ip로 접근이 가능해진다.
외부에서 나한테 접근
이번에는 외부에서 내 hostname으로 접속할 수 있게만들자
1. 호스트네임바꾸기
```
hostnamectl set-hostname tonyhan.com
cat /etc/hostname
```
2. 방화벽에서 ssh 포트로 사용할 2222를 오픈하기
```
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
```
3. ssh 서비스 중 포트 변경하기 22->2222
```
vi /etc/ssh/sshd_config
systemctl restart sshd
journalctl -xe #이걸로 에러난 곳 찾아내기
```
4. vmware workstation에서 포트 포워딩 설정하기
적용해준다음 핸드폰으로 접속해보자
???
대충 핸드폰으로 접속되는 모습
```
ssh-keygen
cd /root/.ssh
cp id_rsa.pub authorized_keys
```
conversions > import key 에서 pem 가져와 ppk로 바꾸기
putty > ssh > kex
NFS(Network File System) : 데이터 스토리지
storage : 저장소 -> 클라우드나 가상화에서 매우 중요한 영역
데이터가 저장될 수 있는 공간
파일 스토리지, 블록 스토리지 또는 오브젝트 스토리지 (redhat.com)
파일 스토리지, 블록 스토리지 또는 오브젝트 스토리지
파일, 블록 및 오브젝트 스토리지의 차이점과 요구사항에 적합한 최적의 스토리지 솔루션을 선택하는 법을 자세히 알아보십시오.
www.redhat.com
자세하게 파일, 블록, 오브젝트 스토리지에 대해 참고하자
1. file storage : 가장 전통적인 스토리지(== shared fillesystem) - NFS, SMB/CIFS
디렉토리를 다른 디바이스 디렉토리에 마운트해서 사용하는 방식. 가장 대중적이면서도 오래된 방식이나, 보안상 결함이 많아 중요한 데이터를 다루는 곳에서는 사용하지 말아야한다. 공유하기 때문에 다른 사람이 파일을 접근할 가능성이 많다. 일정영역만 쓰고 싶다할때 사용. 멀티 프로젝트를 구현하는 클라우드 환경에서는 사용안함. (클라우드 == 멀티 테넌시)
??? 서버리스 : 내가 필요할때만 서버를 돌리는 기능
멀티테넌시(Multitenancy)란? 개념, 장단점 및 비교 분석 (redhat.com)
멀티테넌시(Multitenancy)란? 개념, 장단점 및 비교 분석
멀티테넌시란 단일 소프트웨어 인스턴스로 서로 다른 여러 사용자 그룹에 서비스를 제공할 수 있는 소프트웨어 아키텍처를 뜻하며 여러개의 테넌트(tenant)를 보유합니다.
www.redhat.com
2. block storage(EBS)
aws에서 EBS(Elastic Block Storage). 스토리지의 일정 공간을 볼륨으로 생성하고 이를 원격지에 있는 서버에 연결해 주는 방식이다. NFS가 디렉토리와 디렉토리의 연결처럼 사용된다면, 스토리지에 가상의 디스크(volume)을 만들고 해당 볼륨을 서버에 sda 또는 vda처럼 마치 하나의 물리적인 디스크가 연결된 것처럼 사용된다.
위쪽은 디렉토리를 마운트한건고 이건 디스크를 마운트한거다.
sda, vda같은것을 서버에 연겨해준것이다. 그래서 클라이언트가 연결해서 쓰는 것이다. 대표적인 block storage 를 위한 프로토코은 iSCSI 이다.
3. object storage(S3)
서버나 PC와 같은 물리적인 장치에 연결하는 스토리지가 아니라 계정별로 일정공간을 제공하는 방식이다. 예) 구글 드라이브. 데이터를 저장할 때에는 빠른 입출력 (I/O)가 필요하여 주로 key:value형태로 데이터를 저장한다.
실습 1 : 패키지 설치
```
yum install nfs-utils : 서버를 비롯한 모두 설치됨
```
실습 2 : 방화벽 구성
```
systemctl stop firewalld
systemctl disable firewalld
```
실습 3 : 폴더 구성
```
mkdir /nfs
chmod 777 /nfs
vi /etc/exports
```
옵션은 다음과 같다.
rw : 읽기쓰기 가능
sync : 클라이언트가 서버에 접속하여 데이터를 정상적으로 기록했다면 이에 대한 확인을 서버가 클라이언트에게 보낸다.
async : 클라이언트가 서버에 접속하여 데이터를 정상적으로 기록했다면 이에 대한 확인하지 않는다.
no_root_squash : 클라이언트 작업도 root가 한거로 인정하겠다는 뜻.
작성할때 (policy) 부분 떨어뜨려놓으면 안된다.
```
systemctl restart nfs-server
```
client 측
```
mkdir test
mount -t nfs 192.168.8.199:/nfs /test
```
고민해야할 사항
1. 클라이언트가 nfs 서버에 파일을 작성했다면 누가 작성한 것인가?
2. 클라이언트에서 root로 작업한 내용을 nfs 서버에서 root로 인정해주느냐? 인정한다면 작성된 파일은 root root로 보일 것이다. 이를 해결하기 위해 "no_root_squash"가 필요하다.
위와같이 새로 작성한 파일 작성자와 그룹이 nfsnobody로 뜬다.
서버에서도 위와같이 작성되어 있다. 중요한부분은 가장 마지막에 적힌 쉘이 nologin이다.
참고로 앞서 작성한 root 도 비슷하게 nologin 이다.
3. 마운트 정보를 재부팅 이후에도 유지가 되는가? -> 재부팅하면 마운트가 깨진다.
1) ~/.bashrc에 마운트정보를 미리 기록해놓는다.
2) 부팅단계에서 부터 미리 마운트가 되도록 하고 싶다면? /etc/fstab에 기록해둔다.
위와같이 마운트된 정보가 보인다. swap이라던가 루트등이 보인다.
파일시스템은 nfs이고
읽고쓰고사용가능한 defaults로 해놓고
0 : 마운트되어 있는지 점검안하겠다. (1 : 점검하겠다)
0 : 점검순서
껏다켜보니 정상적으로 마운트 되어 있다.
```
mount | grep nfs
```
명령어로 검색한 결과에서도 nfs가 보인다.
참고로 nfs의 포트번호를 확인하는 방법으로
```
vi /etc/rpc
```
확인가능하다.
다른사람 NFS에 연결하기
TEST01의 네트워크를 Bridged로 바꾸어주었다.
네트워크도 DHCP로 바꾸어주자
딴 ip가 들어와있다.
받아온 ip로 네트워크를 설정해주자
NFS의 폴더를 우리의 /var/www/html에 마운트하자
```
mount -t nfs x.x.x.x:/cloud /var/www/html
umount /var/www/html
```
해주면된다.
nfs 문제점
1. 웹서버는 공인 주소가 직접 입력되어 있어 보안상 결합이 있다.
2. 웹서버와 NFS가 공인주소로 연결되어 있음으로 이 역시 보안상 매우 큰 위헙요소이다.
3. 외부에서 접속하는 사용자들은 웹서버로 접속할때 균일하게 트래픽이 분배되는가? -> 안그러니 한쪽에 트래픽이 집중되는 문제가 발생할 수 있다. 균일하게 트래픽을 나누어 주어야한다.
4. 웹서버가 많은경우 너무많은 공인 주소가 필요. 돈을 아껴야함
???
그래서 위와같이 먼저 Load Balancer(LB)를 설치한다. 이거의 공인 IP 하나만 있으면 된다. 뒤는 사설로 연결하면된다.
서버 뒤에는 스토리지를 연결한다. 그리고 입력한 정보는 DB에 입력된다.
이렇게하면 사용자는 LB에 접속하면된다.
FE는 사용자에게 보여주지만 BE는 뒤에서 FE의 입력을 처리한다.
처음에는 LB가 처음 서버를 사용하지만 RR 방식으로 트래픽을 균등분배 처리해준다.
평소에 DB에 데이터를 저장하면 primary DB로 간다. 그리고 이 데이터는 secondary에 지속적으로 백업된다.