goodthings4me.tistory.com
이전 포스팅에 이어서 카페24 우분투 20.04, 파이썬 가상환경(Django) 하에서 Nginx를 설치하고, Gunicorn과의 연동 설정과 무료 SSL인 Let's Encrypt SSL을 설치하는 절차를 마지막으로 정리해서 올려 봅니다.
이전 포스팅 글은 다음과 같습니다.
본 글의 주요 내용은 다음과 같습니다.
- Nginx 설치 및 Gunicorn과 연동 설정하기 (Nginx 설치하고 구동시키기, sites-available 디렉터리에 설정 파일 생성, ginx가 환경 파일로 읽을 수 있도록 설정, Nginx 실행)
- db.sqlite3 대신에 mariaDB 사용 설정
- 무료 SSL 설치 - Let's Encript (3개월뒤에 SSL 자동으로 갱신되는 스케쥴 등록)
Nginx설치 및 Gunicorn과 연동 설정하기
Nginx는 많은 웹 사이트에서 사용하고 있는 웹 서버 소프트웨어 중 하나인데요, Nginx와 Gunicorn은 모두 웹 서비스에 사용되는 소프트웨어지만,
- Nginx는 주로 정적 파일을 빠르게 서비스하고, 리버스 프록시 기능과 로드 밸런싱 기능을 수행하는데 사용되고,
- Gunicorn은 WSGI 인터페이스를 통해 Python 애플리케이션을 실행하고, 멀티프로세스 및 멀티스레딩을 처리하는데 사용되며,
- Nginx는 웹 서버로서의 역할을 담당하고, Gunicorn은 애플리케이션 서버로서의 역할을 담당합니다.
Nginx 설치하고 구동시키기
nginx는 파이썬 가상환경이 아닌 root에 설치함에 주의!!
root@xxxx:~/jejedj# sudo apt install nginx
root@xxxx:~/jejedj# sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-04-19 16:41:10 KST; 16h ago
Docs: man:nginx(8)
Main PID: 67933 (nginx)
Tasks: 7 (limit: 1125)
Memory: 7.7M
CGroup: /system.slice/nginx.service
├─67933 nginx: master process /usr/sbin/nginx -g daemon on; master_process o>
├─67934 nginx: worker process
├─67935 nginx: worker process
├─67936 nginx: worker process
├─67937 nginx: worker process
├─67938 nginx: worker process
└─67939 nginx: worker process
Apr 19 16:41:10 jeje.cafe24.com systemd[1]: Starting A high performance web server and >
Apr 19 16:41:10 jeje.cafe24.com systemd[1]: Started A high performance web server and a>
lines 1-18/18 (END)
▶ Nginx 설치 폴더 확인하기
root@xxxx:~/jejedj# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
root@xxxx:~/jejedj#
Nginx를 설치하면 /etc/nginx/sites-available 디렉터리에 설정 파일을 저장하는데, 실제 Nginx는 /etc/nginx/sites-enabled 경로에 있는 파일을 보고 있다고 합니다.
sites-enabled 디렉터리는 site-available 디렉터리에 있는 설정 파일 중에서 활성화하고 싶은 것을 링크로 관리하는 디렉터리라고 합니다.
부연 설명을 하면,
sites-available 폴더는 설정을 저장하는 곳이고, 이 안의 설정 파일은 실제로 반영되지 않기 때문에 실제로 반영이 되는 폴더인 sites-enabled 폴더로 설정 파일을 복사해주어야 한다는 것입니다.
(sites-enabled 디렉터리는 site-available 디렉터리에 있는 설정 파일 중에서 활성화하고 싶은 것을 링크로 관리하는 디렉터리)
이런 이유로 인해 /etc/nginx/sites-available/ 경로에 원하는 사이트(내용)를 입력한 뒤 /etc/nginx/sites-enabled로 링크를 걸어주는 게 정석이라고 합니다.
※ sites-available과 sites-enabled 확인
root@xxxx:~/jejedj# cat /etc/nginx/sites-available
cat: /etc/nginx/sites-available: Is a directory
root@xxxx:~/jejedj# cat /etc/nginx/sites-enabled
cat: /etc/nginx/sites-enabled: Is a directory
root@xxxx:~/jejedj# ls /etc/nginx
conf.d koi-utf modules-available proxy_params sites-enabled win-utf
fastcgi.conf koi-win modules-enabled scgi_params snippets
fastcgi_params mime.types nginx.conf sites-available uwsgi_params
(venv) root@xxxx:~/jejedj#
sites-available 디렉터리에 설정 파일 생성
/etc/nginx/sites-available 디렉터리에 설정 파일을 저장
- 작성은 vi /etc/nginx/sites-available/jejedjcnf
- 제거는 rm -r /etc/nginx/sites-available/jejedjcnf
- 확인은 cat /etc/nginx/sites-available/jejedjcnf
※ vi 에디터에서 수정
root@xxxx:~/jejedj# vi /etc/nginx/sites-available/jejedjcnf
vi 에디터에서
i 입력하여 insert 모드에서
아래 내용을 입력
server {
listen 80;
server_name borame.co.kr www.borame.co.kr;
location /favicon.ico { access_log off; log_not_found off; }
location /static/ {
autoindex off;
alias /root/jejedj/staticfiles/;
}
location / {
include proxy_params;
proxy_pass http://unix:/tmp/gunicorn.sock;
}
}
작성 후
ESC
:wq! 엔터
위 내용을 설명하면,
css, js, image 등의 정적 파일은 nginx로 서빙하고, 동적 컨텐츠는 Gunicorn과 같은 WSGI 서버로 프록시하는 방식을 설정하는 것으로
- server { … } 부분은 가상 호스트 서버를 정의하는 것이고,
- listen 80; 은 웹 서버 접속(80번 포트) 시 HTTP 요청을 수신한다는 것을 나타내며,
- server_name borame.co.kr www.borame.co.kr; 은 접속 도메인 URL 지정
- location /favicon.ico { … }은 웹사이트의 아이콘 /favicon.ico 경로에 대한 설정으로 favicon 파일 요청을 로그에서 무시하고 찾을 수 없다는 메시지를 기록하지 않도록 설정하는 것
- location /static/ { … }은 /static/ 경로에 대한 설정으로 정적 파일에 대한 요청을 /root/jejedj/staticfiles/ 디렉토리에서 찾도록 하는 지정
- alias는 요청된 URL에 대해 파일 시스템에서 서로 다른 경로를 사용하는 데 사용
- location / { … }은 프록시 관련 설정을 포함하고, Gunicorn 서버에 대한 프록시 패스를 설정하여 클라이언트 요청은 UNIX 소켓을 통해 Gunicorn 서버로 전달됨 ( 즉, procy_pass는 동적 요청에 대해 gunicorn의 유닉스 소켓방식으로 처리하도록 하는 것으로 등록된 gunicorn의 유닉스 소켓(gunicorn에서 "--bind unix:/tmp/gunicorn.sock")으로 보내서 요청이 처리가 되도록 하는 것임)
Nginx가 환경 파일로 읽을 수 있도록 설정
nginx - gunicorn - django 연결 위해 sites-enabled 폴더로 설정 파일 복사하는 절차임
1) /etc/nginx/sites-enabled 폴더로 이동 후 default 링크 삭제
2) 설정 파일 링크
sudo ln -s /etc/nginx/sites-available/jejedjcnf /etc/nginx/sites-enabled/jejedjcnf
※ 참고) 리눅스 ln (link) 명령어
한 파일을 다른 파일 이름으로도 사용하고자 할 때 사용하는 파일 연결 명령어로 하나의 파일에 이름을 두 개 유지하는 방법을 제공하는 것
▶ 복사 절차는 다음과 같이 합니다.
root@xxxx:~/jejedj# cd /etc/nginx/sites-enabled
root@xxxx:/etc/nginx/sites-enabled# ls
default
root@xxxx:/etc/nginx/sites-enabled# sudo rm default
root@xxxx:/etc/nginx/sites-enabled# ls
root@xxxx:/etc/nginx/sites-enabled# sudo ln -s /etc/nginx/sites-available/jejedjcnf /etc/nginx/sites-enabled/jejedjcnf
root@xxxx:/etc/nginx/sites-enabled# ls
boramcnf
root@xxxx:/etc/nginx/sites-enabled# ls /etc/nginx/sites-available
boramcnf default
root@xxxx:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/jejedjcnf
root@xxxx:/etc/nginx/sites-enabled# cat /etc/nginx/sites-available/jejedjcnf
Nginx 실행
Nginx는 설치 시 자동 실행되므로 작성한 설정 사항을 적용하려면 sudo systemctl restart nginx 명령으로 다시 시작해야 하는데, 시작 전에 nginx 설정 파일 문법 검사 명령(sudo nginx -t)을 주어야 함
root@xxxx:~/jejedj# sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@xxxx:~/jejedj#
브라우저에서 http://www.borame.co.kr/ 접속 성공
settings.py ALLOWED_HOSTS = ['*'] 상태에서 브라우저 http://pypy.kr 또는 http://www.pypy.kr 또는 http://ip 접속 모두 성공함
ALLOWED_HOSTS = ['pypy.kr', 'www.pypy.kr', '1.24.53.101'] 설정 변경 시 http://ip는 접속이 안 되니 ALLOWED_HOSTS = ['pypy.kr', 'www.pypy.kr']으로 설정함
그리고 이제부터는 장고 app 등에 대한 코드 수정 후에는 gunicorn을 재 시작해야 반영이 되고 정상적으로 웹 브라우저 접속이 된다는 점을 알아야 함
위 진행 절차를 완료하고 크롬 등 브라우저에서 http://~ "주의요함"이라는 문구가 나오며, 이문구가 안 나오게 하려면 SSL(Secure Socket Layer) 보안 인증을 설치해야 함
db.sqlite3 대신에 mariaDB 사용 설정
Gunicorn과 Nginx 설치가 정상적으로 완료되면, 장고에서 사용할 mariaDB 사용 설정(db.sqlite3 대신 사용할 DB)을 합니다.
먼저, maiaDB에 사용할 데이터베이스(DB)를 생성하기 위해서 HeidiSQL로 서버 접속 후 HeidiSQL의 "새로 생성 > 데이터베이스"에서 DB명 입력하여 사용할 DB를 생성해도 되고,
또는 putty로 Database에 접속하여 다음 명령으로 실행해도 됩니다.
MariaDB [(none)]> create database DB명;
그 다음으로, VS Code로 원격 접속해서 settings.py에 있는 다음 항목을 수정합니다. (주석 처리된 기존 코드 부분은 삭제해도 됨)
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
## MariaDB 설정 시 - MySql도 동일 ##
"ENGINE": "django.db.backends.mysql",
"HOST": "localhost",
"PORT": "3306",
"NAME": "~", # database name
"USER": "root",
"PASSWORD": "~",
}
}
그리고, 장고의 기본 테이블에 대해 사용할 수 있도록 migrate 명령을 수행합니다.
(venv) root@xxxx:~/jejedj# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
(venv) root@xxxx:~/jejedj#
무료 SSL 설치 - Let's Encrypt (root 에 설치)
무료 SSL 설치 전에 방화벽(cafe24) INBOUND 정책에서 https tcp 443 허용 여부 체크(없으면 추가함)하고, SSL을 설치합니다.
root@xxxx:~# sudo apt install certbot
root@xxxx:~# sudo apt install python3-certbot-nginx
root@xxxx:~# certbot --version
certbot 0.40.0
재 설치를 위한 제거할 때는
sudo apt remove --purge certbot
sudo apt remove --purge python3-certbot-nginx
적용할 도메인은 모두 추가하고,
sudo certbot --nginx -d borame.co.kr -d www.borame.co.kr
도메인 등록 후 설치 중간에 아래와 같이 이메일 입력과 동의/취소 등의 선택 질문이 나오면 입력합니다.
(Enter 'c' to cancel): 이메일 입력
(A)gree/(C)ancel: A
(Y)es/(N)o: Y
그리고, 설치 중간에 다음과 같이 나오면 2를 입력합니다.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
전체 내용은 아래와 같습니다.
root@xxxx:~# sudo certbot --nginx -d borame.co.kr -d www.borame.co..kr
Requested domain www.borame.co..kr is not a FQDN because it contains an empty label.
root@xxxx:~# sudo certbot --nginx -d borame.co.kr -d www.borame.co.kr
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): haemil40@nate.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for borame.co.kr
http-01 challenge for www.borame.co.kr
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/jejedjcnf
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/jejedjcnf
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/jejedjcnf
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/jejedjcnf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://jejedj.co.kr and
https://www.borame.co.kr
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=borame.co.kr
https://www.ssllabs.com/ssltest/analyze.html?d=www.borame.co.kr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/jejedj.co.kr/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/jejedj.co.kr/privkey.pem
Your cert will expire on 2024-07-19. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
root@xxxx:~#
위와 같이 설치가 되면,
/etc/nginx/sites-available/jejedjcnf 부분과 /etc/nginx/sites-enabled/jejedjcnf 부분에 관련 내용이 자동으로 추가됩니다.
자동으로 변경된 내요을 확인하려면,
root@xxxx:~# cat /etc/nginx/sites-available/jejedjcnf
Nginx 플러그인이 설치되어 있는지 확인하려면,
root@xxxx:~# pip show certbot-nginx
Name: certbot-nginx
Version: 0.40.0
Summary: Nginx plugin for Certbot
Home-page: https://github.com/letsencrypt/letsencrypt
Author: Certbot Project
Author-email: client-dev@letsencrypt.org
License: Apache License 2.0
Location: /usr/lib/python3/dist-packages
Requires:
Required-by:
root@xxxx:~#
Nginx 구성을 테스트하고 웹 서버(Nginx)를 재 시작합니다.
root@xxxx:~# sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@xxxx:~# sudo systemctl reload nginx
SSL 자동으로 갱신 (3개월뒤에 자동으로 갱신되는 스케쥴) 등록
무료 SSL은 90일(3개월)간 유지가 되기 때문에 3개월 만료 전에 갱신을 해야 합니다. 이를 자동으로 처리하는 명령이 있습니다.
root@xxxx:~# sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/jejedj.co.kr.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for borame.co.kr
http-01 challenge for www.borame.co.kr
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/jejedj.co.kr/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/jejedj.co.kr/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
root@xxxx:~#
※ 무료 SSL 기간 중에 잔여 인증기간 확인하는 명령
root@xxxx:~# sudo certbot certificates
지그까지 3회에 걸친 포스팅으로
카페24 우분투 20.04, 파이썬 가상환경(Django) 하에서 Gunicorn 설치, Nginx 설치하고 Gunicorn과의 연동 설정, mariaDB 설치와 heidisql 사용 방법, 무료 SSL인 Let's Encript SSL을 설치하고 3개월 자동 연장하는 절차 등에 대해 정리해서 올렸습니다.
'IT(Tip)' 카테고리의 다른 글
구글 gemini api 키 발급하고 사용해보기 (0) | 2024.08.24 |
---|---|
cafe24 우분투 20.04에 파이썬 가상환경, Django, Gunicorn 설치 (0) | 2024.05.08 |
cafe24 가상서버호스팅 우분투 20.04에 파이썬 3.x, MariaDB 10.4 설치 (0) | 2024.05.07 |
VS Code에서 Anaconda 사용하여 Python 3.9 가상환경 설정하는 방법 (0) | 2024.01.02 |
윈도우11 탐색기 파일 속성 '추가옵션표시' 없애는 방법 (0) | 2023.12.23 |
댓글