# deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main
** 아래와 같이 형태로 만들면 됩니다 **
deb http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu focal main
deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu focal main
3-3. apt update
sudo apt update
4. Nginx 소스 다운로드
- Modsecurity를 컴파일 하려면 Nginx 소스코드를 다운로드 해야 합니다.
4-1. 디렉토리 생성 및 구성
sudo mkdir /usr/local/src/nginx
cd /usr/local/src/nginx
#필요한 경우, 생성한 디렉터리에 권한을 할당합니다.
sudo chown username:username /usr/local/src -R
4-2. 종속성 설치 및 소스코드 다운로드
sudo apt install dpkg-dev
sudo apt source nginx
## 아래와 비슷한 에러메시지가 나타날 수 있지만, 무시해도 됩니다 ##
dpkg-source: info: extracting nginx in nginx-1.21.1
dpkg-source: info: unpacking nginx_1.21.1.orig.tar.gz
dpkg-source: info: unpacking nginx_1.21.1-1+ubuntu20.04.1+deb.sury.org+1.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying 0001-Make-sure-signature-stays-the-same-in-all-nginx-buil.patch
dpkg-source: info: applying 0002-define_gnu_source-on-other-glibc-based-platforms.patch
W: Download is performed unsandboxed as root as file 'nginx_1.21.1.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
4.3 다운로드 받은 Nginx 버전과 현재 설치되어있는 Nginx 버전이 같은지 확인합니다.
- 같은 버전으로 다운받아야 컴파일 할 수 있습니다.
ls
## 결과 예시 ##
onsemiro@ubuntu:/usr/local/src/nginx$ ls
nginx-1.21.1
nginx_1.21.1-1+ubuntu20.04.1+deb.sury.org+1.debian.tar.xz
nginx_1.21.1-1+ubuntu20.04.1+deb.sury.org+1.dsc
nginx_1.21.1.orig.tar.gz
nginx_1.21.1.orig.tar.gz.asc
nginx -v
## 결과 예시 ##
onsemiro@ubuntu:/usr/local/src/nginx$ nginx -v
nginx version: nginx/1.21.1
sudo nginx -t
## 결과 ##
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
## nginx 재시작 ##
sudo systemctl restart nginx
예전에 작성해두었던, 위 글을 참조해서 오랜만에 SSL을 적용하려고 아래 명령어를 입력했다.
certbot --nginx -d AAA.co.kr -d www.AAA.co.kr
그랬더니, 생각보다 오랜 시간이 걸린 후, 아래와 같은 에러 메시지가 나왔다.
Failed authorization procedure. AAA.co.kr (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://AAA.co.kr/.well-known/acme-challenge/96Ot7ZF9cVMwcycFhodd96TXi97sFQ9OR7Ln2sPpwN4 [183.111.125.112]: "\n<!DOCTYPE html>\n<html class=\"html\" lang=\"ko-KR\" itemscope itemtype=\"http://schema.org/WebPage\">\n<head>\n\t<meta charset=\"UTF-8\">\n", www.AAA.co.kr (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://AAA.co.kr/.well-known/acme-challenge/YTz6-bfcu9UWltNrFoqkYxrURdasHSTSePse7oH6zyI [183.111.125.112]: "<html>\r\n<head><title>504 Gateway Time-out</title></head>\r\n<body>\r\n<center><h1>504 Gateway Time-out</h1></center>\r\n<hr><center>ng"
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: AAA.co.kr
Type: unauthorized
Detail: Invalid response from
http://AAA.co.kr/.well-known/acme-challenge/96Ot7ZF9cVMwcycFhodd96TXi97sFQ9OR7Ln2sPpwN4
[183.111.125.112]: "\n<!DOCTYPE html>\n<html class=\"html\"
lang=\"ko-KR\" itemscope
itemtype=\"http://schema.org/WebPage\">\n<head>\n\t<meta
charset=\"UTF-8\">\n"
Domain: www.AAA.co.kr
Type: unauthorized
Detail: Invalid response from
http://AAA.co.kr/.well-known/acme-challenge/YTz6-bfcu9UWltNrFoqkYxrURdasHSTSePse7oH6zyI
[183.111.125.112]: "<html>\r\n<head><title>504 Gateway
Time-out</title></head>\r\n<body>\r\n<center><h1>504 Gateway
Time-out</h1></center>\r\n<hr><center>ng"
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
이전이랑 똑같이 했는데,.. 왜 안되지..?
이것저것 찾아보니, 발생할 수 있는 이유는 여러가지가 있었다.
1. 해당 주소가 https로 리다이렉트 되고 있는 경우.
2. 해당 URL의 .well-known/acme-challenge/ <=== 이 경로로 접근이 안되는경우
여기서 --webroot는 인증서를 발급받을 홈페이지 소스가 있는 폴더의 경로를 적어주면 된다.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for AAA.co.kr
http-01 challenge for www.AAA.co.kr
Using the webroot path /var/www/1800_7058_co_kr for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/AAA.co.kr/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/AAA.co.kr/privkey.pem
Your cert will expire on 2020-12-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- 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
명령어를 실행하면, 위와 같이 잘 되었다고 나온다.
그러면, /etc/letsencrypt/archive/AAA.co.kr 경로아래에 인증서들이 발급된 것을 확인할 수 있다.
그럼 이제, 이 인증서들을 이용해서, nginx에 설정해주면 된다.
server {
## 이 부분은 http로 접속하면, https로 리다이렉트 시켜주는 부분이다 ##
listen 80;
root /var/www/AAA;
server_name AAA.co.kr www.AAA.co.kr;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
root /var/www/sbcompany_co_kr;
server_name AAA.co.kr www.AAA.co.kr;
index index.php;
## 아래 4줄이 아까 발급받은 인증서를 설정 하는 부분이다. ##
ssl_certificate /etc/letsencrypt/live/AAA.co.kr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/AAA.co.kr/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsec_includes.conf;
#modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 360d;
}
access_log /var/log/nginx/sbcompany_co_kr/access.log;
location / {
try_files $uri $uri/ /index.php?q=uri&$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /xmlrpc.php {
deny all;
return 444;
}
}
## 보통은 이 부분만 만든다.
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
## 나는 로그를 서브도메인별로 따로따로 저장하게 설정이 되어있어서,
## 이 부분까지 설정해 주었다.
/var/log/nginx/*/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
각각이 뜻하는 바를 알아보면,
daily : 하루치를 따로따로 보관하자.
missingok : 로그 파일이 없어도 에러를 내지말자.
rotate 52 : 로그 파일을 52개까지만 보관하자. 위에 daily로 설정되어 있으니, 52일치만 보관하고, 53일째 되는 로그는 삭제.
compress : 로그를 압축해서 보관하자.
notifempty: 로그파일이 비어있으면, 로테이트 하지 않습니다.
create 640 nginx adm : 로그파일은 새로 생성시에, 파일 권한을 640으로 생성하고, 소유자/그룹은 nginx로 하자.
postrotate : 로테이트 작업이 끝난후에, 실행할 스크립트를 입력합니다.
위 설정 후, 정상적으로 설정되었는지, 테스트하기 위해서 아래의 명령어를 실행합니다.
logrotate -d -f /etc/logrotate.d/nginx
정상적으로 설정되었다면, /etc/cron.daily/logrotate 파일로 인해서, 매일 자동 실행됩니다.
혹시, /etc/cron.daily/logrotate 파일이 없다면,
아래와 같이 만들어 주자.
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf