SQL 최적화란?

- DBMS 내부에서 프로시저를 작성하고 컴파일해서 실행 가능한 상태로 만드는 전 과정

 

1. SQL 실행하기 전 최적화 과정

1-1 SQL 파싱

  •  파싱 트리 생성 : SQL 문을 이루는 개별 구성요소를 분석해서 파싱 트리 생성
  • Syntax 체크 : 문법적 오류가 없는지 확인
  • Semantic 체크 : 의미상 오류가 없는지 확인

1-2 SQL 최적화

  • SQL 옵티마이저는 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 다양한 실행경로를 생성
  • 다양한 실행경로 내에서 가장 효율적인 하나를 선택한다.
  • 데이터베이스 성능을 결정하는 가장 핵심적인 엔진

1-3 로우 소스 생성

  • SQL 옵티마이저가 선택한 실행경로를 실제 실행 가능한 프로시저 형태로 포맷팅 하는 단계
  • 로우 소스 생성기가 그 역할을 맡는다.

 

2. SQL 옵티마이저

2-1 옵티마이저 최적환 단계

  • 사용자로부터 받은 쿼리를 수행하는데 후보군이 될 실행 계획을 탐색
  • Data Dictionary에 미리 저장된 정보를 이용해 각 실행계획의 예상비용을 산정
  • 최저 비용을 나타내는 실행계획을 선택

 

 

 

3. 옵티마이저 힌트

옵티마이저의 경로를 선택할 때 기준인 Cost는 어디까지나 예상치다.

대부분 옳은 선택을 하지만, SQL이 복잡할 수록 경로 선택에 실수를 할 가능성이 크다.

 

만약에 개발자가 옵티마이저보다 더 효율적인 경로를 찾을 수 있다면

옵티마이저 힌트를 이용해 액세스 경로를 바꿀 수 있다.

 

사용 예시 : 주석 기호에 '+'를 붙이면 된다.

SELECT /*+ INDEX(A 고객_PK) */
	고객명, 연락처, 주소, 가입일시
FROM 고객 A
WHERE 고객ID = '0000008'

 

 

주의사항

  • 힌트와 힌트 사이에 ','(콤마)를 사용할 수 없다.
  • 테이블을 지정할 때 스키마명까지 명시하면 안 된다.
  • FROM절에서 ALIAS를 사용했다면, 힌트에도 ALIAS를 사용해야한다.

 

 

4. 라이브러리 캐시

SQL 파싱, 최적화, 로우 소스 생성 과정을 거쳐 생성한 내부 프로시저를 반복 재사용할 수 있도록

캐싱해두는 메모리 공간을 말한다.

 

아래 그림을 살펴보자.

소프트 파싱 : 라이브러리 캐시에서 찾아서 곧바로 실행단계로 넘어가는 것

하드 파싱 : 라이브러리 캐시에서 찾는 데 실패해 최적화, 로우 소스 생성 과정을 모두 거치는 것

 

 

 

 

 

 

 

 

 

 

 

옵티마이저가 SQL를 최적화 할 때 엄청나게 많은 연산을 진행한다.

이 무거운 연산을 쿼리문이 들어올 때 마다 하드 파싱을 하게 되면 CPU를 많이 소비하게 되는 원인이 된다.

따라서 이를 방지하게 하기 위해 재활용 할 수 있게 해주는 역할이 바로 라이브러리 캐시이다.

 

5. 바인드 변수

순간적으로 쇼핑몰에 이벤트로 고객이 몰린다고 가정을 해보자.

해당 시스템에 접속을 시도하게 되고, 코드는 다음과 같다.

 

public void login(String login_id) throws Exception {
    String SQLStmt = "SELECT * FROM CUSTOMER WHERE LOGIN_ID = '" + login_id + "'";
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery(SQLStmt);
    if(rs.next()) {
        // do anything
    }
    rs.close();
    st.close();
}

 

이렇게 될 경우 아까 말한 하드파싱이 발생하게 된다.

내부적으로 돌아가는 코드를 보게 되면 다음과 같다.

 

SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'oraking'
SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'javaking'
SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'tommy'
SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'karajan'
...

 

고객이 로그인할 때마다 위와 같이 각각의 DBMS 내부 프로시저를 만들게 된다.

하드파싱이 여러번 발생하는 원인이 된다.

 

이를 방지하기 위해

1. 로그인 ID를 파라미터로 받는 프로시저 하나를 공유하면서 재사용을 하도록 유도한다.

2. 파라미터 Driven 방식으로 SQL를 작성을 한다. 여기서 바인드 변수가 등장한다.

 

수정된 코드는 다음과 같다.

public void login(String login_id) throws Exception {
    String SQLStmt = "SELECT * FROM CUSTOMER WHERE LOGIN_ID = ?";
    PreparedStatement st = con.prepareStatement(SQLStmt);
    st.setString(1, login_id);
    ResultSet rs = st.executeQuery();
    if(rs.next()) {
        // do anything
    }
    rs.close();
    st.close();
}

 

이러면 하드파싱은 최초 1번만 발생하게 된다.

 

 

 

6. 데이터베이스 저장 구조

테이블 스페이스 : 세그먼트를 담는 컨테이너

세그먼트 : 데이터 저장공간이 필요한 오브젝트

익스텐트 : 공간을 확장하는 단위

블록 : 데이터를 읽고 쓰는 단위

 

 

테이블이나 인덱스에 데이터를 입력하다가 공간이 부족해지면

해당 테이블스페이스로부터 익스텐트를 추가로 할당받는다.

 

익스텐트 단위로 공간을 확장하지만, 사용자가 입력한 레코드를 저장하는 공간은 데이터 블록이다.

한 데이터 블록에 저장된 레코드는 모두 같은 테이블 레코드이다.

 

7. DB 버퍼 캐시

디스크 I/O가 SQL 성능을 결정한다.

자주 읽는 블록을 매번 디스크에서 읽는 것 = 매우 비효율적

DBMS에 데이터 캐싱 메커니즘이 등장하게 된 이유

 

DB 버퍼 캐시 : 디스크에서 어렵게 읽은 데이터 블록을 캐싱해 둠으로써 반복적인 I/O Call을 줄인다.

 

 

8. 논리적 I/O vs 물리적 I/O

논리적 블록 I/O = SQL를 처리하는 과정에서 발생한 총 블록 I/O

물리적 블록 I/O = 디스크에서 발생한 총 블록 I/O

 

 

 

디스크를 액세스 하는 경우 : SQL에서 읽어야 할 블록을 DB 버퍼 캐시에서 찾지 못했을 경우

 

 

9. 버퍼캐시 히트율

BCHR = ( 1 - (물리적 I/O) / (논리적 I/O)) x 100

BCHR은 읽은 전체 블록 중에서 물리적 디스크를 거치지 않고 메모리에서 찾은 비율을 나타낸다.

 

위의 식을 변형하면 다음으로 바꿀 수 있다.

물리적 I/O = 논리적 I/O x (100% - BCHR)

 

여기서 중요한 점은 BCHR은 시스템 상황에 따라 달라진다.

그러면 자연스럽게 BCHR의 성능에 따라 물리적 I/O도 달라진다.

즉 BCHR, 물리적 I/O는 통제 불가능한 외생변수

 

따라서 SQL 성능을 높이기 위해서는 논리적 I/O를 줄여야 한다.

논리적 I/O가 줄어들면 자연스럽게 물리적 I/O도 줄인다.

논리적 I/O를 줄일려면 SQL를 튜닝해서 읽는 총 블록 개수를 줄인다.

 

10. Single Block I/O vs Multiblock I/O

캐시에서 찾지 못한 데이터 블록은 I/O Call을 통해 디스크에서 DB 버퍼캐시에 적재하고 읽는다.

이 과정에서 2가지 형태로 나뉜다.

 

Single Block I/O = 한 번에 한 블록씩 요청해서 메모리에 적재하는 방식

인덱스는 소량 데이터를 읽을 때 주로 사용하므로 이 방식이 효율적이다.

 

Multiblock I/O = 한 번에 여러 블록씩 요청해서 메모리에 적재하는 방식

테이블을 전체를 스캔할 때 이 방식을 사용한다. (Table Full scan)

 

Table Full Scan = 시퀀셜 액세스 + Multiblock I/O 방식으로 디스크 블록을 읽는다.

한 블록에 속한 모든 레코드를 읽고, 캐시에서 못 찾으면 I/O Call을 통해 인접한 수십~수백 개의 블록을 1번에 I/O

대량 Good

 

Index Range Scan  = 랜덤 액세스 + Single Block I/O 방식으로 디스크 블록을 읽는다.

캐시에서 블록을 못 찾으면 레코드 1개를 읽기 위해 매번 잠을 자는 I/O 매커니즘

소량 Good 

 

 

11. 래치

버퍼캐시에 캐싱된 버퍼블록은 모두 공유자원이다.

문제는 하나의 버퍼블록에 2개 이상의 프로세스가 동시에 접근 할 때 발생한다.

동시에 접근하면 블록 정합성의 문제가 생길 수 있다.

이를 해결하기 위해 순차적으로 접근시키기 위한 직렬화 매커니즘 필요.

 

특정 순간에는 한 프로세스만 사용하고, 다른 프로세스는 기다리도록 만든다.

이런 줄서기가 가능하도록 지원하는 매커니즘 = 래치(Latch)

 

빠른 데이터베이스를 구현할려면 버퍼캐시 히트율을 높여야 하지만, 캐시 I/O도 빠르지 않을 수 있다.

버퍼캐시는 공유자원이기에, 히트율이 높을수록 프로세스들이 동시에 접근하면서 래치에 의한 경합 발생 가능.

 

 

DB의 두 단계의 직렬화 메커니즘

1단계 Cache Buffer Chain Latch “블록이 어디 있는지 찾기 위한” 잠금
2단계 Buffer Lock “찾은 블록의 실제 읽기/수정 시 필요한” 잠금

 

 

 

출처 : 친절한 SQL 튜닝 / 조시형 지음

이번 포스트는 클라우드 동기화 진행하도록 하겠습니다.

 

1. 이미지 생성시 자동으로 Blob Storage로 업로드

 

이미지가 있는 디렉토리로 이동해서 vi를 이용해 sh파일을 생성합니다.

 

sh 파일 생성 예시 코드

 

실제 코드

 

그리고 sh 파일을 다 만들었으면 실행을 시킵니다.

./upload_to_azure.sh

 

여기서 -bash: ./upload_to_azure.sh: Permission denied 뜰 경우 다음과 같이 실행합니다.

 

ls -l upload_to_azure.sh을 사용하여 upload_to_azure.sh 파일이 실행권한이 없는지 확인합니다.실행결과 : -rw-rw-r-- 1 azureuser azureuser 453 Sep 22 01:56 upload_to_azure.sh 

 

오류 이유 : 실행 권한 x가 없음

 

따라서 실행권한 x를 부여한다. chmod +x upload_to_azure.sh 
실행결과 : -rwxrwxr-x 1 azureuser azureuser 453 Sep 22 01:56 upload_to_azure.sh

 

다만 chmod +x upload_to_azure.sh을 사용할 경우

소유자(owner), 그룹(group), 기타(other) — 세 권한 블록 모두에게 실행(x) 권한이 추가됩니다

 

 

 

실행 결과

 

 

정상적으로 저장되었는지 Azure container에서 확인한다.

이미지가 잘 저장된걸로 보아 잘 저장되었다.

 

 

2. Stable Diffusion에서 만든 이미지를 컨테이너에 동기화

watchmedo shell-command --patterns="*.png" --recursive --command="./upload_to_azure.sh" ./

위의 코드를 실행하게 되면 이벤트가 발생하기 전까지 대기 상태로 있습니다.

 

1번 VM에서 저걸 실행시켜주시고

2번 VM에서 ./webui.sh --share를 통해 웹에서 Stable Diffusion로 이미지를 생성합니다.

 

그러면 1번 VM에서 컨테이너에 자동으로 이미지를 동기화 시켜줍니다.

 

 

예시) 2번 VM에서 웹에서 Stable Diffusion을 만듬

 

 

예시) 1번 VM에서 동기화 시작

 

예시) 실제로 동기화가 됐는지 Container에서 확인

실제로 잘 저장된 모습을 확인할 수 있습니다.

 

1. Storage Account 생성

리소스 그룹에서 새로 만들기로, Storage Account를 만들어줍니다.

 

 

2. 컨테이너 생성

Storage Account 배포를 완료했다면 들어가서 컨테이너를 만들어줍니다.

 

3. 공유 액세스 서명

 

파일을 동기화시키기 위해 인증 관련 정보를 필요로 합니다.

 

 

 

그리고 아래로 내리시면 SAS 및 연결 문자열 생성을 완료하시면

아래와 같이 복사 할 수 있는 내용들이 있습니다.

있다가 동기화 시킬 때 Blob service SAS URL를 사용합니다.

 

 

4. 이미지 생성시 자동으로 Blob Storage로 업로드

 

여기서는 watchdog, azure cli 2개를 사용합니다.

 

Watchdog = 해당 폴더에 변화가 감지될 경우 자동으로 클라우드에 업로드할 수 있게 해줍니다.

Azure CLI = 해당 폴더를 Blob Storage의 컨테이너에 업로드 할 수 있도록 합니다.

 

저는 webui-forge 환경에서 진행했기 때문에 conda activate webui-forge를 사용합니다.

 

pip install watchdog
sudo apt-get install azure-cli

 

 

설치했으면 현재 위치의 모든 파일을 Azure Blob Storage 컨테이너와 동기화를 시작합니다.

저는 현재 디렉토리의 파일을 옮기기 떄문에 

"$LOCAL_PATH" = '.'

<BLOB SERVICE URL> =  3번의 Blob service SAS URL을 사용합니다.

<CONTAINER NAME> = 2번에서 만들어준 컨테이너 이름입니다.

azcopy sync "$LOCAL_PATH" "<BLOB SERVICE URL>/<CONTAINER NAME>" --recursive

 

실행하면 이런 느낌입니다.

1번째 빨간색 네모가 LOCAL_PATH, 2번째 빨간색 네모가 CONTAINER NAME입니다.

그 사이는 BLOB SERVICE URL이구요.

 

좀더 자세히 설명하면 BLOB URL에서 windows.net 뒤에 CONTAINER NAME를 추가해줍니다.

어떻게 보면 BLOB SERVICE URL 내에서 CONTAINER NAME를 추가한다고 생각하시면 되겠네요.

 

 

그리고 Container로 들어가보면

아까 Stable Diffusion 진행하면서 저장됐던 사진들이 저장된 것을 볼 수 있습니다.

다른 말로 하면 Cloud에 동기화시켰다고 볼 수 있겠습니다.

1. Stable Diffusion Forge WebUI 설치

git clone을 이용해서 파일을 다운로드 받아주시고 설치가 완료가 되면

ls -al을 통해 정상적으로 파일이 받아졌는지 확인하시고 진행하시면 됩니다.

 

 

 

2. Hugging Face 회원가입

 

Hugging Face를 쓰는 이유

 

  • 접근 권한 관리 (Authentication & Authorization)
    • Stable Diffusion 같은 모델은 라이선스나 사용 조건이 붙어 있어, 아무나 제한 없이 다운로드할 수 없도록 관리됩니다.
    • Hugging Face 토큰은 “이 사용자가 Hugging Face에 가입했고, 해당 모델을 쓸 수 있는 권한이 있다”는 인증 수단
  • 사용자 추적 및 라이선스 동의 확인
    • Ex) CompVis/stable-diffusion-v1-4 같은 모델은 이용하기 전에 라이선스 동의 버튼을 눌러야 다운로드가 가능해요.
    • 토큰을 통해 Hugging Face는 어떤 계정이 해당 모델을 다운로드했는지 기록하고, 라이선스 동의 여부를 확인.
  • API 호출 및 rate limit 관리
    • 로컬에서 모델을 다운로드할 때뿐 아니라, Hugging Face Hub의 API를 통해 모델 가중치나 파이프라인을 불러올 때도 토큰이 필요합니다.
    • 이걸로 사용량을 계정 단위로 추적하고, 무분별한 요청이나 abuse를 방지합니다.

 

 

Hugging Face에 회원가입 진행하고, 확인 메일에 보내준 링크로 들어가면 회원가입 처리가 완료가 됩니다.

 

3. Hugging Face 토큰 발급 받기

오른쪽 상단에 프로필 아이콘을 누르면 Access Token에 들어가서 Create new token으로 만들면 됩니다.

 

Read 옵션으로 하고 Token name 적어주시고, Create token을 만들면

Value값으로 랜덤한 문자열을 주는데 이걸 잘 보관하시면 됩니다.

 

잘 완료했다면 아래와 같이 토큰이 생깁니다.

여기서 쓰이는 값은 Value의 "hf_..RZIJ" 입니다

 

4. Stable Diffusion Forge WebUI 설치2

3번에서 받은 발급 받는 Token의 key를 저기 <Your Hugging Face Token>에 넣어주시면 됩니다.

저의 경우 hf_..RZIJ 이겠네요.

1번째 명령어만 실행하고 다음을 실행해줍니다.

 

Stable Diffusion을 사용하기 위한 라이브러리 설치입니다.

cd ~/stable-diffusion-webui-forge
sudo apt-get update
sudo apt-get install libgoogle-perftools-dev
./webui.sh --share

 

4. Stable Diffusion 실습

 

위에 ./webui.sh --share를 실행을 하면 

아래와 같이 나오는데, 저 URL로 이동하면 다음과 같은 페이지가 뜹니다.

 

 

1. UI를 xl로 바꿔줍니다.

2. prompt에 내가 만들고 싶은 사진을 텍스트로 적습니다.

3. 만들기

4. 몇 초후에 내가 적은 텍스트를 사진으로 반환해줍니다. 

 

civitdl 여기서 사진 정보를 가져와서 적용시켜 줄 수도 있는데, 

이 부분은 시간이 없어서 따로 진행하지는 않았습니다.

 

 

위의 사이트에서 만든 사이트들은 아래와 같은 경로에 저장되게 됩니다.

 

 

만약에 여기서 만든 결과물을 가져오고 싶으면 아래와 같이 진행합니다.

 

 

예시로 제가 사진 1장을 가져온다고 하면

이런 식으로 Azure VM에서 윈도우로 가져올 수 있습니다.

 Stable Diffusion이 무엇인가?

  • Stable Diffusion오픈소스 이미지 생성 인공지능 모델입니다.
  • 텍스트로 설명을 입력하면그에 맞는 이미지를 만들어 주는 텍스트-투-이미지(Text-to-Image) 모델입니다.

 

Stable Diffusion을 사용할 때는 GPU가 필요하기 때문에

GPU가 포함된 가상 머신을 이용하여 진행할 에정입니다.

 

여기서의 목표는 Stable Diffusion을 통해 만들어진 이미지를

Cloud에 동기화 시키는 것이 목표입니다.

1. 진행과정

이런 형태로 진행이 됩니다.

워드프레스 실습 부분에서 리소스 그룹은 만들었기 때문에 이 부분은 패스하고 진행하도록 하겠습니다.

 

 

2. Machine Learning Studio 설치

 

 

그리고 배포를 완료를 합니다.

워드프레스 쪽에서 상세하게 다뤘기 때문에 빠르게 진행하겠습니다.

 

 

리소스로 이동한 후 Studio web URL로 이동합니다.

 

그리고 왼쪽 설정 탭을 보면 이렇게 관리 부분에 컴퓨팅이라고 있습니다.

 

그러면 다음과 같은 화면이 나오는데

컴퓨팅 인스턴스 누른 후에 새로 만들기 하시면 됩니다.

 

 

3. 컴퓨팅 인스턴스 만들기

저희는 한정된 자원이기 때문에 최대한 모든 사람들이 이용할 수 있는

코어가 4개 있는 Standard NC4ax_T4_v3로 진행하였습니다.

설정 완료 후에 다음 눌러주시면 됩니다.

 

 

이와 같은 단계를 다 진행하면 아래와 같이 뜨고 최종적으로 만들기 하시면 됩니다.

 

 

그리고 한 10분 정도 기다리면 실행중이 됩니다

 

3. 가상머신 접속하기

 

1. 연결을 통해 들어오면 오른쪽 화면에서 SSH 설정을 할 수 있습니다.

2. SSH에서 아까 받았던 key의 경로를 적으시면 3번에 저절로 명령어가 추가가 됩니다.

3. 이 명령어를 복사해서 CMD에 입력하시면 정상적으로 접속이 됩니다.

 

 

정상적으로 접속이 되는 모습입니다.

이제 이 환경에서 진행하시면 되겠습니다.

지난번 실습에서 HTTPS 웹페이지 만드는 것 가지 완료했고,

이후에 Wordpress 설정을 마저 해보겠습니다. 

저는 한국어로 진행했습니다.

 

1. 워드프레스 기본 설정

 

VM 쪽에서 만들 때 저희는 비밀번호를 지정하지 않았기 때문에 공백으로 둡니다.

만약에 비밀번호를 설정하셨다면 그 비밀번호를 적어주시면 됩니다.

그리고 제출을 눌러주시면

 

 

정상적으로 완료가 됩니다.

 

 

 

 

워드프레스 설치 후에 아까 위에서 지정한 사용자명과 비밀번호를 입력하고 로그인을 해주면

다음과 같은 화면이 뜨게 된다.

 

가장 기초적인 화면의 블로그가 생성된 것을 볼 수 있다.

 

 

 

2. 블로그 설정하기

관리자 모드에서 좌측을 보면 여러가지 설정을 할 수 있다.

관리자 모드로 가고 싶으면 내 주소에 주소 뒤에 wp-admin을 붙여주시면 됩니다.

 

테마는 크게 블로그, 쇼핑몰 설정이 가능한데, 저는 블로그로 진행해보겠습니다.

 

 

글에서 글 작성하고, 모양에서 대충 테마를 반영해서 만들어주시면

대충 이런 모양이 나옵니다.

이런 식으로 블로그가 성공적으로 만들어졌습니다.

 

 

 

1. 워드프레스 다운로드 및 구성

cd로 작업을 진행할 디렉토리로 이동해준다.

이제 여기서 기존에 있던 html 디렉토리을 삭제해야하는데

sudo rm -rf *는 기존에 다른 파일들도 날릴 수도 있어서 html 디렉토리만 삭제하게 명령어 지정 필요

 

wget를 통해 압축 파일 받아오고, tar로 압축 해제

압축 해제를 진행했다면 압축 파일은 필요 없으므로 (메모리 낭비) 삭제

 

그리고 wordpress 디렉토리 이름을 html로 변경

 

 

2. Apache2 설정

www-data로 변경하는 이유 

  • 웹서버(Apache)는 일반적으로 www-data라는 특정 사용자 계정으로 동작합니다.
  • 따라서 www-data가 파일에 접근하거나 수정할 수 있도록 권한을 변경해야 합니다.
  • ex) 워드프레스는 이미지 업로드나 플러그인 설치 시 파일을 수정해야 하는데, www-data가 권한이 없으면 에러가 발생합니다.

 

 

 

3. wordpress.conf 설정

 

마지막 명령어를 실행하면 vi 편집기가 열리게 된다.

관리자 이메일 주소는 간단한 실습이기 때문에 아무렇게나 적었습니다.

서버 도메인 주소는 앞에서 생성한 가상머신에서 찾을 수 있다.

 

4. DNS 이름 부여

설정한 Azure 가상머신에서 개요를 가면 해당 탭을 찾을 수 있다.

DNS 이름을 복사해서 ServerName 쪽에 붙여 넣어주면 된다..

 

5. 완성된 wordpress.conf

이제 여기서 주의해야 할 점은 </VirtualHost> 부분에 아래 추가적인 줄이 없게 해주길 바란다.

바로 밑에 ~가 표시되면 OK

 

만약에 ~이 아닌 공백인 1줄이 있다면, 나중에 HTTPS로 변환할 때 해당 오류를 발생시킨다.

Could not reverse map the HTTPS VirtualHost to the original

이 오류 때문에 고생 많이했다.. 별거 아닌데 찾기가 너무 까다로워서 조심하시길 바란다.

 

6. Apache 서버 설정 및 Certbot 

 

a2ensite가 필요한 이유 : Apache가 sites-available과 sites-enabled 구조로 설정 파일을 관리하기 때문입니다.

🔹 Apache의 사이트 설정 구조

  • /etc/apache2/sites-available/
    → 실제로 존재하는 가상 호스트 설정 파일들이 저장되는 곳 (예: wordpress.conf, 000-default.conf 등).
    → 그냥 여기에만 두면 Apache는 자동으로 읽지 않습니다.
  • /etc/apache2/sites-enabled/
    → 실제로 Apache가 실행 시 참조하는 설정 파일들이 들어있는 곳.
    → 사실상 이 디렉토리는 sites-available 안에 있는 설정 파일에 대한 심볼릭 링크 모음.

쉽게 이해하면 윈도우의 바로가기와 같은 역할을 한다고 생각하시면 됩니다.

 

 

certbot의 역할

  • Let's Encrypt 인증서 발급 + Apache/Nginx 설정 자동화 + HTTP 요청 리다이렉트 설정을 해줌으로써
  • 결과적으로 브라우저에서 http://example.com 으로 접속해도 https://example.com으로 자동 전환됩니다.

 

7. HTTPS로 변환 완료

위에 명령문을 실행하고 나면 인증서 발급 완료 + HTTPS이 가능하다고 메세지가 옵니다.

 

그리고 일반 웹 브라우저에 DNS이름을 복사 붙여넣기를 하면 

https가 앞에 붙는 것을 볼 수 있다.

 

 

 

 

8. 지금까지 한 내용 정리

1. Azure에서 가상 머신 띄우기.= 마치 내 컴퓨터처럼 원격으로 사용 가능

2. SSH를 이용해서 VM에 안전하게 접속 = 원격으로 서버에 명령어를 입력하여 작업 가능

3. Maria DB로 데이터베이스  설정 = 워드프레스에서 글, 사진, 사용자 정보를 저장할 공간

4. 워드프레스 다운로드 및 설치 = 블로그나 웹 사이트를 쉽게 만들 수 있는 도구

5. Apache 서버 설정 = 웹 서버 소프트웨어를 사용해 워드프레스가 작동할 수 있도록 

6. Certbot 도구 사용 = SSL 인증서를 설치해서 https:// 대신 https://로 시작하는 사이트

7. 실제로 내가 만든 워드프레스 사이트 작동하는지 확인

실습1에서 Azure VM에 접속하는걸 완료했으니 그 다음부터 진행하도록 하겠습니다.

 

1. VM에서 기초 설정

사용할려는 라이브러리 최신화 과정이라고 생각하시면 됩니다.

azure VM에 들어온 후에 진행해주시면 됩니다.

 

2. MariaDB 보안 설정 화면

sudo mysql_secure_installation을 실행하면 아래와 같이 나온다.

 

여기서는 실습하는 과정이기 때문에 root password을 NO로 설정하였으나,

실제로 WordPress를 사용할 경우 추가적인 비밀번호 설정이 필요하다.

 

 

문제없이 잘 진행되었다면 다음과 같은 화면이 나옵니다.

 

 

3. MariaDB에 wordpress 데이터베이스 생성 및 설정

위에서 비밀번호를 ''로 (공백)으로 처리했기 때문에 '비밀번호' -> ''로 적어준다.

 

+ Recent posts