728x90

 

요즘 사무실 리눅스 서버에 명령어를 입력 할 때 다음과 같은 명령어가 나왔다.

You have new mail in /var/spool/mail/~~~

 

여기로도 메일이 오는 건가 싶어서 찾아보니

mail 이라는 명령어를 입력하면 받은 메일을 확인할 수 있다고 했다.

 

들어가보니 무려 2만개가 넘는 메일이 쌓이고 있었다 ㅎㅎ( 2018년부터 )

"/var/spool/mail/~~~": 22933 messages 22933 new

 

d[메일번호] 로 메일을 지울 수 있다고 해서 메일을 지워줬다.

 

메일을 나가고 싶을 땐 q를 입력하면 된다 ㅎㅎ

 

 

728x90
728x90

 

yum update를 하는데 아래와 같은 에러 발생 

 

The GPG keys listed for the "MySQL 5.7 Community Server" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.

 

검색해보니 GPG key가 만료되어 해당 에러가 발생한다고 하더군요.

해결 방법은 아래의 명령어로 키 업데이트를 진행하면 된다고 합니다.

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

 

 


 

참고

 

CentOS 7 MYSQL 5.7 설치 GPG keys 오류 해결 방법

CentOS 7에서 아래와 같이 yum으로 MYSQL 5.7을 설치하다가 오류가 발생하고 해결해 내용을 공유드립니다. [root@localhost ~]# yum install http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm [root@localhost ~]# y

change-words.tistory.com

 

728x90
728x90

 

리눅스 서버에 레디스 설치 👉 yum install epel-release 명령어 입력 👉 아래 사진과 같은 에러 발생

 

 

검색해보니 참고한 블로그에서 CentOS 6 의 yum 지원이 종료 되었다고 하더군요.

 

해결 방법으로는 아래의 명령어를 사용하면 된다고 합니다.

# 32비트인 경우
echo "https://vault.centos.org/6.10/os/i386/" > /var/cache/yum/i386/6/base/mirrorlist.txt
echo "http://vault.centos.org/6.10/extras/i386/" > /var/cache/yum/i386/6/extras/mirrorlist.txt
echo "http://vault.centos.org/6.10/updates/i386/" > /var/cache/yum/i386/6/updates/mirrorlist.txt
yum update
# 64비트인 경우
echo "https://vault.centos.org/6.10/os/x86_64/" > /var/cache/yum/x86_64/6/base/mirrorlist.txt
echo "http://vault.centos.org/6.10/extras/x86_64/" > /var/cache/yum/x86_64/6/extras/mirrorlist.txt
echo "http://vault.centos.org/6.10/updates/x86_64/" > /var/cache/yum/x86_64/6/updates/mirrorlist.txt
yum update

 

++ 왜인지 모르겠으나,

echo 명령어 실행시, 그런 디렉토리가 없습니다 라는 에러가 나서

echo 명령어 한 번 yum update 한 번 이렇게 반복(?)하면서 명령어를 실행했습니다.

 

 


 

참고

 

CentOS 6 지원 종료로 인한 yum 사용 불가 해결

오늘 업무용으로 쓰던 CentOS 서버의 yum 업데이트가 전혀 안됩니다 이유를 몰라서 방화벽 및 서버 와 ...

blog.naver.com

 

728x90
728x90

환경 : 오라클 리눅스 8

상황 : nginx 설치 했으나, 80번으로 접속했을 때 연결 거부함.

해결 : 방화벽 오픈 후, 방화벽 재시작

 

// 방화벽 오픈
firewall-cmd --zone=public --add-port=80/tcp --permanent
// 방화벽 재시작
firewall-cmd --reload

 

 


 

 

인증서 연결이 안돼서 삽질 하다가ㅠㅠㅠ

원인은 위와 같은 이유 때문이었다. 분명 포트 확인했을 때 443 열려있는 걸 확인해서 왜 안되지.. 했는데

netstat -nap | grep LISTEN

 

 

그냥 다시 포트 오픈 후 재시작 해주니 되었다😅😂

728x90
728x90

ip:3000 으로 접속하면 정상 작동하는데, ip로 접속하면 에러가 나서 한참 찾다가 (nginx 설정 제대로 완료한 상태) nginx log를 검색해보니, (명령어 : sudo tail -f /var/log/nginx/error.log)

 

connect() to 127.0.0.1:3000 failed (13: Permission denied) while connecting to upstream 이런 에러가 발생하고 있었다.

 

검색해보니, SELinux 의 httpd 설정이 필요하다는 참고 블로그의 말을 듣고 아래의 명령어를 실행해 보았다.

 

sudo setsebool -P httpd_can_network_connect on

 

명령어 실행 후 다시 접속해보니 정상 작동하는 것을 확인할 수 있었다.

 

++ 실행 환경은 오라클 리눅스 8 입니다!!

 

 

참고 블로그

https://cofs.tistory.com/411

728x90
728x90

사이드 프로젝트를 Netlify 로 배포하고 운영하다보니, (nuxt 프로젝트)

블로그나 홈페이지 같은 정적 사이트가 아니라서 발생하는 문제가 있었습니다.

 

target을 server로 하고 배포하고 있어서 nuxt의 dynamic directory를 잡지 못하고 404로 반환하는 것이 가장 큰 문제였습니다.

이로인해 가장 중요한 홍보 수단이었던 카카오톡에서 og 태그들을 인식하지 못해

사용자들이 불편함을 겪을 것 같아 서버 이전을 고민했고, 런칭 초기인 지금 빨리 이전하는 게 맞겠다는 판단이 들었습니다.

 

오라클 클라우드에 인스턴스를 생성하여 NGINX로 웹서버를 구축하고 Docker로 프로젝트를 띄운 과정을 기록으로 남겨보았습니다. (+https 연결 과정도 남겨두었습니다.)

 

계정 생성

https://cloud.oracle.com/

 

무료 클라우드 이용할 수 있는 곳들 중 오라클 클라우드를추천 받아서 사용해 보았습니다.

EC2 생성 및 배포 경험이 있어서 비슷한 플로우로 사용할 수 있었습니다.

 

계정 생성을 하고 카드 등록을 해주면 되는데,

시키는 대로 하면 금방 마칠 수 있었습니다.

비자 카드로 해야 에러 안 난다고 다른 블로그에서 그랬는데 나는 비자 카드로 했을 때 에러가 나서

마스터 카드로 등록을 했습니다.

 

영어로 등록하는 게 좋다고 해서 영어로 등록했고,

집주소는 네이버 '영문주소'에서 찾아서 적었습니다.

 

영문주소 : 네이버 통합검색

'영문주소'의 네이버 통합검색 결과입니다.

search.naver.com

 

계정 생성에 성공하면 친절하게 튜토리얼 간단히 알려주는데 저는 그런 튜토리얼들은 다 읽어보는 스타일이라서 다 읽은 후,

바로 인스턴스 하나 생성해 보았습니다.

 

인스턴스 생성

무료로 생성 가능한 버전으로 설정이 되어있었고,

해당페이지에서 바로 서브넷과 VCN을 생성할 수 있어서 인스턴스 만들기도 금방할 수 있었습니다.

이 때 private key를 다운로드를 받아주어야 합니다.

 

인스턴스 ssh 접속

생성된 인스턴스의 디테일에 들어가면 public ip와 username이 있습니다.

키를 다운로드 받은 곳에 터미널을 위치시키고

ssh -i *.key username@123.123.123 (예시) 로 접속할 수 있었습니다.

 

인스턴스 디테일을 확인해보니 username은 opc였습니다.

 

 


무언가 설치하고 또 설치하고 그러는 과정 중에 꼬여서 그런지 제대로 안되는 상황이 발생해서 두번 정도 새로 인스턴스를 만들었습니다.😭

최종적으로 제대로 성공했던 순서대로 과정을 적어보았습니다.

 

인스턴스를 생성하고, (생성은 기본 설정되어 있는 무료 버전으로 생성, oracle linux 8) 가장 먼저 한 일은 yum update이었습니다.

(시간이 꽤 오래 걸리므로 가장 먼저 시작!)

sudo yum update

 

SWAP 설정

참고한 블로그를 살펴보니, 1GB 의 RAM이 부족할 수 있어 아래의 명령어를 통해 늘려주는 작업을 하면 좋다고 했습니다.

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

서버를 재시작하여도 설정 값이 유지되도록 아래 파일에도 추가로 적어줄 것이 있었습니다.

sudo nano /etc/fstab
# 제일 하단에 이걸 추가하면 됩니다.

/swapfile swap swap defaults 0 0

nano라는 에디터는 이번에 처음 써 보았는데 맥 기준 ^O를 누르고 엔터를 치면 빠져나올 수 있었습니다 (vim의 :wq)

 

free -h 명령어로 설정 값이 잘 변했는지 확인할 수 있습니다.

 

 

Docker 설치

생각보다 도커 설치가 꽤 까다로웠던 기억이 나네요.

여러 자료를 찾고 시도해 보았는데 실패를 해서 ㅠㅠ 이 자료를 보고 설치에 성공했습니다.

 

아래의 명령어로 도커를 설치

sudo dnf install -y dnf-utils zip unzip
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf remove -y runc
sudo dnf install -y docker-ce --nobest

 

아래의 명령어로 도커를 시작

sudo systemctl enable docker.service
sudo systemctl start docker.service

 

도커 허브에 올린 프로젝트를 pull받고 run 하여 실행했습니다.

 

NGINX 설치

nginx 설치는 이 자료를 참고했습니다.

sudo dnf install -y nginx
sudo systemctl enable --now nginx.service
sudo systemctl status nginx

 

nginx 설정은 간단하게 

/etc/nginx.conf를 변경하여 사용했습니다.

server 80에 location을 http://127.0.0.1:3000으로 해놓고 실행하면 프로젝트 실행이 잘 되는 것을 확인할 수 있었습니다.

(저의 경우 nuxt 프로젝트를 도커에 run 한 상황이었습니다.)

 

++ 퍼블릭 ip로 제대로 연결 되었는지 확인하기 전에 서브넷에서 80번, 443번 포트를 열어주었습니다.

oracle cloud 인스턴스 상세 > 생성한 서브넷 클릭 > Security Lists에 있는 요소 클릭 > Add Ingress Rules로 세 번째 사진 처럼 작성

 

아래의 명령어로 80번 포트를 오픈해줍니다.

// 방화벽 오픈
firewall-cmd --zone=public --add-port=80/tcp --permanent

// 방화벽 재시작
firewall-cmd --reload

 

 

 

HTTPS 연결

배포를 위해 무료 도메인 생성 사이트인 내도메인.한국 에서 도메인을 등록하고,

도메인 수정 > [IP연결(A)] 에 인스턴스 퍼블릭 ip를 적어주었습니다.

 

그 다음은 certbot으로 LetsEncrypts로 무료 ssl 인증서를 발급해주었습니다.

위의 과정들로 퍼블릭 ip, 도메인이 준비되었습니다.

 

시작 전, 서버에서 아래의 명령어로 443 포트를 오픈해줍니다.

// 방화벽 오픈
firewall-cmd --zone=public --add-port=443/tcp --permanent

// 방화벽 재시작
firewall-cmd --reload

 

아래의 명령어로 Snap 설치를 진행합니다.

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

sudo yum install snapd
sudo systemctl enable snapd

sudo ln -s /var/lib/snapd/snap /snap
sudo systemctl start snapd

sudo snap install core; sudo snap refresh core

 

아래의 명령어로 Certbot을 설치하고 인증서를 발급받습니다.

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

certbot --version
sudo certbot certonly --nginx -d example.com

약관 동의에 Y를 해주고,

이메일을 물어보는데 이메일 적어주고 광고 수신 동의 에는 N을 해주었습니다.

 

인증서 발급이 성공적으로 되면

nginx.conf를 수정해줍니다.

server {
  listen 80;
  server_name example.com;
  
  location / {
    return 301 https://$host$request_uri;
  }
}

server {
    listen       443 ssl;
    server_name  example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / { 
        proxy_pass         http://127.0.0.1:3000;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

 

 

 

 

 

참고한 자료들

 

https://blog.ny64.kr/posts/oracle-cloud-swap-setup-and-nginx-installation/

https://oracle-base.com/articles/linux/docker-install-docker-on-oracle-linux-ol8

https://docs.oracle.com/en/learn/oracle-linux-nginx/#create-a-custom-nginx-configuration

https://bitgadak.tistory.com/6

728x90
728x90
UPDATE 테이블_명
SET
<if test="param1 != null">
    param1 = #{param1} ,
</if>
<if test="param1 != null">
    param2 = #{param2} ,
</if>
<if test="param3 != null">
    param3 = #{param3} ,
</if>
WHERE
idx = #{idx}

이런 구조로 된 SQL문이 있었다.

당연히 마지막 ',' 때문에 에러가 발생한다.

 

WHERE이 저런 상황이라면 1=1을 추가해주면 되던데

SET은 1=1을 할 수 없었다.

++ 1=1도 찾아보니 성능상 좋지 않다고 한다.

 

이때 SET에 trim이라는 것을 사용해 보았는데, 아래와 같이 사용하면 된다.

UPDATE 테이블_명
<trim prefix="SET" suffixOverrides=",">
    <if test="param1 != null">
        param1 = #{param1},
    </if>
    <if test="param=2 != null">
        param=2 = #{param2},
    </if>
    <if test="param=3 != null">
        param=3 = #{param3},
    </if>
</trim>

 

trim의 옵션 prefix와 suffixOverrides는 이러한 기능이라고 한다.

prefix : trim 안에 있는 모든 문자열의 앞에 붙여줄 문자열
suffixOverrides : trim 안에 있는 모든 문자열의 조건문을 판별해서 문자열 맨 끝에서부터 하나 지워줄 문자열

 

 

 

 

참고

https://devfunny.tistory.com/11

728x90

'Server > Database' 카테고리의 다른 글

[Mybatis] #{}, ${}의 차이  (0) 2022.11.07
[MySQL] IntelliJ 테이블 복사  (0) 2022.09.15
[MySQL] auto increment 1로 변경하는 방법  (0) 2022.08.30
728x90

주로 #{} 이렇게 되어있는데 ${} 이렇게 되어있는 부분도 있어서 검색해보았다.

#{}와 ${}의 가장 큰 차이는 '', String이냐 아니냐의 차이인 것 같다.

 

#{}

String 형태로 주입되어 자동적으로 ''가 붙는 형태가 된다.

WHERE user_idx = #{user_idx}

예를 들면 위의 경우 출력되는 쿼리문은 WHERE user_idx = '2'의 형태가 된다.

쿼리 주입을 예방할 수 있어서 보안 측면에서 유리하다.

 

${}

String 형태가 아닌 주입되는 형태 그대로 출력된다.

쿼리 주입을 예방할 수 없어서 보안 측면에서 불리하다.

테이블 명, 칼럼 명을 전달할 때 사용한다. #{}의 경우 String 형태이기 때문에 ''가 붙어서 사용할 수 없다.

 

 

 

출처

https://logical-code.tistory.com/25

728x90

+ Recent posts