AWS 클라우드 서버에서 백엔드와 프론트엔드를 배포중이고, 젠킨스까지 하나의 서버에서 진행하려고 합니다.
Nginx 활용한 리버스 프록시, SSL 적용
https://anythingis.tistory.com/175
직접적인 포트노출을 줄이고 HTTPS 적용을 위해 Nginx를 활용해 리버스 프록시 서버로 활용중이고 젠킨스를 추가 설정합니다.
활용중인 Nginx Conf
server {
server_name domain;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
location /api {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
error_page 405 = $uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
# proxy_pass http://localhost:3000;
}
}
server {
if ($host = domain) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name domain;
return 404; # managed by Certbot
}
도메인 url로 들어오는 요청은 프론트로, 도메인/api로 들어오는 요청은 백엔드로 보내고 있고, jenkins는 자바 기반 웹 애플리케이션으로 localhost:8080이 시작점이지만, docker로 실행해 host 8082 포트와 jenkins container 8080와 포트포워딩을 진행했습니다.
도메인으로 접근하지만 jenkins에 요청을 하기 위해서는 두가지 방법이 있습니다.
1. nginx 에서 jenkins로 시작하는 요청을 rewrite 후 localhost:8082로 프록시 패스
2. jenkins 서버에 prefix jenkins를 붙이고 nginx에서 localhost:8082/jenkins로 프록시 패스
첫번째 방법은 왠지 모르지만 접근하면 nginx 404 not Found 에러가 발생해서 ... 두번째 방법으로 해결하는 법 포스팅하겠습니다.
Jenkins Prefix 추가
1. 도커
젠킨스를 도커로 아직 실행하지 않았다면 실행하면 끝입니다. Nginx Jenkins Proxy 부분으로 넘어가세요
docker run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-e JENKINS_OPTS="--prefix=/jenkins" \
jenkins/jenkins:lts
1. 로컬, 이미 실행중인 도커 컨테이너
저는 이미 실행중인 도커 컨테이너에 적용해야 해서 해당 방법을 적용했습니다.
docker exec -it -u root jenkins-container /bin/bash
cd /var/jenkins_home
echo "JENKINS_OPTS=\"--prefix=/jenkins\"" >> jenkins.properties
#vi, vim, nano등의 편집기 없다면
apt-get update
apt-get install -y nano
vi /usr/local/bin/jenkins.sh
2. jenkins.sh 스크립트 파일에 설정 내용 읽는 부분 추가
if [ -f /var/jenkins_home/jenkins.properties ]; then
. /var/jenkins_home/jenkins.properties
fi
3. docker or jenkins 재실행
docker restart jenkins-container
systemctl restart jenkins
Nginx Jenkins Proxy
/etc/nginx/nginx.conf 나 활용중인 site-available 내에 conf 파일에 jenkins 프록시 설정을 추가합니다.
# jenkins upstream 설정
upstream jenkins {
keepalive 32; # keepalive connections
server 127.0.0.1:8082; # jenkins ip and port
}
# nginx websocket 활용 설정
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
server_name domain;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
location /api {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
error_page 405 = $uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# location jenkins
location /jenkins {
sendfile off;
proxy_pass http://jenkins;
proxy_redirect default;
proxy_http_version 1.1;
# Required for Jenkins websocket agents
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
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_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_request_buffering off; # Required for HTTP CLI commands
}
location / {
root /var/www/html;
}
}
server {
if ($host = domain) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name domain;
return 404; # managed by Certbot
}
Nginx test & Reload
sudo nginx -t
sudo nginx -s reload
Https 적용과 jenkins로 시작하는 prefix가 적용되었습니다.
참고