폴더에 읽기 및 편집 권한을 준다. (하위 폴더까지)

chown {소유권자}:{그룹식별자} {소유권을 변경하고 싶은 디렉토리명}
chown -R root:root test

 

리눅스 명령어를 정리해보자.

분류
명령어
설명
관리자 권한으로 실행
$ sudo
super user
  1. 관리자만 읽을 수 있는 파일 읽기
  2. 새로운 프로그램 설치(ubuntu)
기본 명령어
$ ls
list
파일 보기
$ al
all
파일의 세부내용 확인
$ cd
change directory
디렉토리 이동
$ pwd
print working directory
현재 디렉토리 경로 확인
$ cd ~
홈 디렉토리 이동
$ cd /
루트 디렉토리 이동
$ cd .
현재 디렉토리
$ cd ..
부모 디렉토리 이동
$ clear
터미널 정보 지워줌
$ touch [file_name]
빈 파일을 만듬
$ mkdir [dir_name]
make directory
빈 폴더를 만듬
$ cat [file_name]
concatenate
텍스트 형태 파일 확인
$ mv [file or dic name]
[target_dir_name]
move
파일 또는 디렉토리 위치 옮기기
$ mv [file or dic name]
[new file name]
파일 및 디렉토리 이름 변경
$ cp [file][target_dir_name]
copy
복사
$ cp -r [folder_name]
all copy
하위폴더 및 파일
까지 복사
삭제 관련
$ rm [file_name]
remove
파일 삭제
$ rm -r [dir_name]
remove
폴더 삭제
$ rm -rf [dir_name]
no question remove
삭제할 때 경고창 생략 삭제
파일 소유권 변경
$ chown -R root:root [file_name OR dir_name]
change owner
파일 소유권 변경,
-R을 추가할 경우
하위 폴더 및 파일까지 소유권이 변경됌
GUI 프로그램 실행
$ explorer .
현재 폴더를 window 관리자에서 보기
$ open .
현재 폴더를 macOS finder에서 보기
$ code .
현재 폴더를 VS Code 에디터로 열기

추가적으로 더 발생하면 적어주자

 

CentOS에 Node.js 설치를 해야되는데, 버전에 민감하지 않다면

관리자 권한 기준으로 터미널에

라고 입력하면

nodejs 와 npm 이 같이 설치 된다.

이렇게 나오면 성공!

근데 너무 버전을 신경쓰지 않았던 걸까?

버전이 낮아 npm 명령어가 실행 안되는 부분이 있어

node.js 를 재설치 했다.

내가 원하는 버전은 16버전이라, 다시 세팅했다.

일단 버전을 확인하고 npm의 캐시를 싹 삭제하자.

그리고 현재 깔려있는 node.js 와 npm을 삭제한다.

curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -

아래의 url을 참고하여 원하는 버전의 nodejs 버전을 curl 을 통해 세팅한다.

github.com/nodesource/distributions/blob/master/README.md

 

그리고, 아래와 같이 명령어를 작성하면...!

끝으로 node -v와 npm -v를 통해 버전을 확인하면,

원하는 버전이 세팅되어 있다.

우분투의 경우 npm은 같이 설치 되지 않던데

왜 그런걸까? 나중에 알아보기로 하자

파일 복사

cp test.txt test_2.txt

폴더 복사 (하위 폴더까지)

cp -r test test2
 

 

개발하다보면 의도치 않게 프로젝트를 종료했음에도 포트가 살아 있는 경우가 있다.

그럴 때는 포트를 찾아서 종료해야 프로젝트가 정상적으로 실행된다.

1. 종료하길 원하는 포트번호를 찾자

lsof -i :포트번호

포트를 종료하려면 포트번호가 아닌 PID가 필요한데, PID를 종료시켜야 한다.

2. 포트 종료하기

kill -9 [종료대상 PID]

포트 종료를 하고 포트 찾기 명령어를 확인하니 나오지 않는다.

종료가 잘 됐다.

서버를 원격으로 연결하여 프로그램을 실행한 이후,

터미널로 봤을 때는 프로그램이 정상적으로 실행되고 있지만

터미널 세션을 종료하면 프로그램이 같이 종료되는 경우가 있다.

터미널을 종료해도 프로그램을 실행할 수 있도록 하는 방법이 몇 가지 있지만

제일 쉬웠던 방법만 써본다.

  1. 평상시 프로젝트 실행 명령
npm run start

   2. 개선 방법

nohup npm run start & exit

nohup 명령어로 실행하고

exit 의 경우에는 따로 입력하여 종료한다.

나같은 경우 터미널을 그냥 x버튼을 클릭하여 종료했는데

그러면 nohup 명령어가 정상적으로

실행되지 않기에

exit 로 안전하게 터미널을 빠져나간다.

요즘 웹사이트들은 보안인증을 위해 기본적으로 HTTPS 를 적용한다.

그러므로 NginX 환경에서 SSL 인증을 해볼 것이다.

SSL 인증서는 기본적으로 구매를 해야 하는 데,

나의 경우에는 개발서버에 구축을 해야 하다보니 금액이 부담스러워

무료 SSL 인증서를 써야 했다.

고맙게도 무료 SSL 인증서를 만들어주는 곳이 있으니 그것을 활용해보자.

(90일간 사용가능하며, 인증서 갱신 가능)

 

https://letsencrypt.org/ko/docs/

필자의 경우 CentOS 에서 하므로, Yum 으로 통일한다.

1.Certbot 설치

sudo yum install certbot

정상적으로 설치되면 아래와 같이 나올 것이다.

Certbot 이 설치되었으니 SSL 인증을 할 도메인을 등록해주어야 한다.

2. 도메인 등록

sudo certbot certonly --standalone -d 도메인주소

위와 같은 명령어를 실행하고 필자의 경우 중간에 아래와 같은 에러가 발생했는 데,

80포트가 중첩되어 발생한 에러였다.

현재 사용하고 있는 80포트는 NginX 였으므로, NginX 를 stop 시키고 다시 명령어를 실행했다.

3. NginX Stop, 도메인 등록 재실행 (포트가 중첩되었을 경우에만 해당)

sudo systemctl stop nginx sudo certbot certonly --standalone -d 도메인주소

다시 명령어를 실행하는 경우 따로 질문을 하지않고 인증서가 등록된다.

여기서 fullchain.pem 과 privkey.pem 의 경로를 꼭 기억하고 있어야 한다.

향후 Nginx 파일을 수정할 때 작성하기 때문이다.

그 다음으로 해당 인증서가 없어질 수도 있기 때문에,

다른 곳에 따로 백업을 해두자.

4. 인증서 백업

sudo cp -r /etc/letsencrypt/ /home/사용자 // etc에 있는 letsencrypt를 , 사용자 경로로 복사

경로는 본인 입맛에 맞는 곳으로 설정하자.

꼭 안해도 되지만, 안전을 위해 해두는 것이 좋을 것 같다.

5. default.conf 파일 수정

여기서부터 상당히 중요한데, SSL 도입을 하는 경우 앞선 포스팅의 리버스프록시 부분보다

많은 부분이 수정된다.

cd /etc/nginx/conf.d // conf.d 폴더로 이동 sudo vim default.conf // default.conf 파일 수정

전체 소스

server {
                listen 80 default_server;
                server_name 도메인주소.kr;
                return 301 https://$host$request_uri;  
        }
server {
                listen 443 ssl http2  ;
                listen [::]:443 ssl http2  ;
                server_name localhost;
                ssl on;
                ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem;
                ssl_session_timeout 1d;
                ssl_session_cache shared:SSL:50m;
                ssl_session_tickets off;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                resolver 8.8.8.8;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                proxy_buffer_size 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
                keepalive_timeout 10;
                location / {
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                        proxy_pass http://localhost:3000;
       }
}

 

소스를 분석해보자.

* 전체 개요

나의 경우 http 로 접근을 하든, https 로 접근을 하든, 80포트에서 3000번 포트로

포트포워딩을 해줘야하는 상황이었다.

그래서 1차적으로 80포트로 접근했을 때 아래와 같은 443포트로 이동시켰고,

443포트 내에서 리버스프록시로 서버내의 3000포트로 이동시켰다.

* SSL 설정

이부분은 구글링을 하다보니 옵션이 매우 상세해서, 공식문서를 참고하셔도 좋으나

필요없는 부분도 있기에 내가 설정한 것만 사용해도 좋을 것 같다.

SSL 설정 부분

다른부분은 복사해서 붙여넣어도 상관없으나,

ssl_certificate 와 ssl_certificate_key 부분은 각자 도메인 및 경로에 맞는 것으로 설정을 해주자.

옵션별로 자세한 해설은 나중에 다뤄보겠다.

6. Nginx 재시작

sudo systemctl restart nginx

HTTPS 적용한 모습

성공 !

* 오류

1. 쿠키 문제

나의 경우 다른사람의 글대로 적은 데로 세팅을 해도 안됐다.

그런데 알고보니 개발환경에서 특정 URL 로 너무 리다이렉트되서

접근이 안되던 것이었다.

그럴 경우에는 쿠키를 삭제해주면 된다.

https://support.google.com/chrome/answer/95647?hl=ko&visit_id=637946724970155827-1235010596&p=rl_error&rd=1#zippy=%2C%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%97%90%EC%84%9C-%EC%BF%A0%ED%82%A4-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0

2. 도메인 문제

서버 내에서 등록된 도메인으로 적을 경우 리다이렉트 안되는 문제가

발생하여 localhost로 바꾸니 정상 적용된다.

 

리눅스 서버 세팅을 하다가 NginX를 설치하고, 리버스 프록시 설정을 해줄 필요가 생겼다.

설치하기 전에 NginX 와 리버스 프록시에 대해 간략히 알아보자.

1.NginX 란?

Nginx 는 일종의 웹서버로서 흔히들 아는 Apache 웹서버와는 다르게

비동기 이벤트 기반 구조로 동작한다.

이로 인해 서버에 부하가 발생 시 성능 예측이 쉬운 편이다.

무엇보다, 내 기준으로는 Apache Web Server 보다 환경설정이 쉬운 편이었다.

2.Reverse Proxy 란?

리버스(역방향) 프록시, 즉 프록시 서버는 일종의 중계 서버이다.

클라이언트가 외부에서 서버로 접근해올 때, 프록시 서버는 내부 서버의 정보를 알고 있으므로,

클라이언트를 올바른 자리로 이동시켜주는 역할이라고 하겠다.

예를 들어

손님(클라이언트), 식당 종업원(프록시 서버), 식당 내부 상황(내부 서버)

이런 가정일 때,

손님이 들어오면 식당 종업원이 맞아, 빈 자리로 안내한다.

즉 식당종업원이라는 프록시 서버가 판단하여 내부 서버의 적당한 자리로 이동시킨다는 것이다.( 맞나 ..? )

1.NginX 설치 (CentOS)

sudo yum install nginx

만약 안될 경우, epel repository가 비활성이 의심되므로 활성화를 해준다.

yum install epel-release

2. Nginx 설치 경로

2-1) 최상위 경로로 이동하여 다음 명령어를 쓴다.

cd / cd etc/nginx ls -al

2-2) nginx 로 가서 파일 리스트를 조회하면 다음과 같이 나오는 데, 눈 여겨볼 것은 conf.d 디렉토리이다.

3. conf.d 로 접근하여 default.conf 조회 (없을 경우 파일을 만들어주세요.)

4. default.conf 파일 수정(중요)

sudo vi default.conf

 

server {
         listen 80 default_server;  // 설정 포트
         server_name m.proxy.com;  // 사용자에게 유입될 도메인
         location / {
                  proxy_pass http://m.proxy.com:3000; // 실제 사용될 도메인(내부서버)
                  proxy_set_header Host $host;
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_buffer_size          128k;
                  proxy_buffers              4 256k;
                  proxy_busy_buffers_size    256k;
         }
}

최초 유입 도메인인 m.proxy.com 으로 접근되면,

실제 사용될 내부서버인 m.proxy.com:3000으로 이동시킨다.

그에 따른 프록시 헤더값이며, 필요한 것이 있을 때마다 추가해주면 되겠다.

버퍼 사이즈를 설정한 이유는 버퍼를 설정하지 않을 경우 접근시간이 초과되 502 에러가 나오는 경우가 있어

설정했다.

5. Nginx 재시작

5-1) 현재 Nginx 상태 확인

nginx -t

이상이 있을 경우 에러코드가 발생하고, 없을 경우 success 라고 메시지가 나올 것이다.

5-2) Nginx 재시작

sudo systemctl restart nginx

별 이상이 없으면 여기서 끝나겠지만, 필자가 삽질을 하도 많이해서

그에 따른 대처방법을 작성하겠다.

* 삽질

1.site-available, site-enable 폴더 부재

구글링을 해보니 대부분 위와 같은 폴더 기준으로 설정을 하라고 하는데,

나의 경우 NginX 버전이 안 맞는 건지 없었다.

최근버전의 경우 conf.d 폴더 안에 있는 *.conf 폴더로 설정하는 거 같아

default.conf 폴더로 진행했다.

2. Bad not GateWay(502) 에러

1차적으로 default.conf 파일에 버퍼사이즈를 조정하면 된다고 언급되있지만,

나의 경우 해결되지 않았다.

위와 다른 문제가 있어 이방법으로 해결했다.

* 원인 SELinux 의 네트워크 보안 문제

리눅스 커널 모듈에서 기본적으로 httpd 에 의해

네트워크 연결 기본값이 false 로 되어 있다.

그러므로 우린 이것을 true 로 바꿔주면 된다.

sudo setsebool -P httpd_can_network_connect true

위와 같은 명령어를 작성하니 쉽게 해결 !

오랜만에 NginX 를 설정해보니 과거와 다른 점이 많아 

삽질을 많이 했다.

이걸 보시는 분은 삽질을 덜 하시길...

1단계는 끝났고, 마지막 2단계를 향해 가보자.

https://blog.naver.com/ohks486/222833865442

하루단위로 서버가 자꾸 내려가길래..뭔가 했더니

인위적으로 매우 빠른속도로 도메인에 접근 시도를 하더라..

이제 차단해보자.

내가 사용하는 리눅스는 CentOs 를 쓰는데 기본적으로 firewall 이 있더라.

구글링을 해보니 iptables 로 차단하는 게 적절해보여 이것으로 시도해보자.

우선 iptables 로그파일을 생성하도록 rsyslog.conf 에 RULE을 추가한다.

1. vi /etc/rsyslog.conf

RULE 추가

kern.* /var/log/iptables.log

2. iptable 서비스 추가, 재부팅시 설정값이 사라지지않도록 systemctl 에 서비스를 등록한다.

yum install iptables-services
systemctl enable iptables.service #(자동실행)

3. 특정 포트로 접근하는 것들 차단

(80 포트로 1초에 5번이상 접근하는 것들 차단)

iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 1 --hitcount 5 --name HTTP -j DROP

간단하게 긴급조치할것만 작성하였고 다음에 또 알아보도록 하자

웹 사이트 운영하다보면.. 사람뿐만 아니라 '봇'이 접근하여 사이트의 정보를 긁어가거나

인위적으로 접근을 시도하는 것이 더러 있다.

이것들은 웹사이트를 운영하는 관리자의 입장에서 전혀 도움이 되지 않는 것들이기 때문에,

이것들을 차단해보는 방법을 알아보자.

첫번째 방법으로 robot.txt 파일로 차단하는 방법이 있지만, 대개 악성봇들은 막아주지 못하기 때문에

Nginx 에서 설정해서 차단해보자.

1. /etc/nginx/conf.d/default.conf 파일 수정

( Nginx 버전에 따라 없는 분은 /etc/nginx/sites-available/도메인.conf 파일 수정)

server {
         if ($http_user_agent ~* (AhrefsBot|BLEXBot|DotBot|SemrushBot|Eyeotabot|PetalBot|MJ12bot|brands-bot|bbot|AhrefsBo|MegaIndex|UCBrowser|Mb2345Browser|MicroMessenger|LieBaoFast|Headless|netEstate|newspaper|Adsbot/3.1|WordPress/|ltx71) ) {
          return 403;
       }
}

해당 url 로 접근하기전에 http_user_agent 값이 다음과 같으면 403페이지로 이동시킨다.

( 악성봇은 생각보다 더 많으니 nginx의 access.log를 확인하여 추가적으로 식별하면 더 추가하여 작성한다.)

2. nginx 테스트후 재시작

nginx -t systemctl restart nginx

+ Recent posts