forked from TEAM-2NE1/steach-server
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnginx.server.conf
More file actions
150 lines (127 loc) · 8.5 KB
/
nginx.server.conf
File metadata and controls
150 lines (127 loc) · 8.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# 과거에 nginx를 도커로 처리하려고 했을 시절
# nginx위에 jenkins와 back server가 잘 작동 되던 nginx.conf 코드
# 리버스 프록시, 트래픽 처리도 잘 되던 코드.
events { }
http {
# Nginx 설정 파일에 resolver 지시어를 추가하여 Docker의 내장 DNS를 사용하도록 설정할 수 있습니다.
# 이렇게 하면 Nginx가 주기적으로 DNS를 재조회하게 되어, 나중에 steach-server와 holy-jenkins가 연결될 때 해당 호스트를 찾을 수 있게 됩니다.
resolver 127.0.0.11 valid=30s; # Docker의 내장 DNS 사용
# 요청 속도 제한을 정의하는 영역 설정
# limit_req_zone 지시어를 사용하여 요청 속도 제한 설정
# 여기서는 IP 주소당 초당 3개의 요청을 허용하고, 10MB의 메모리를 사용하여 'ip_limit'이라는 이름을 지정
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=3r/s;
server {
listen 80; # Nginx가 요청을 받을 포트 설정
# 아래 server_name이 없는 경우
# 이 경우, Nginx는 기본 서버 블록으로 간주하고 모든 요청을 처리합니다.
# 특정 도메인에 대해 동작을 제어하기 어렵습니다.
# 이 경우, 43.202.1.52 도메인으로 들어오는 요청만 이 서버 블록에서 처리됩니다.
# 특정 도메인에 대해 맞춤형 설정을 적용할 수 있습니다.
server_name 43.202.1.52;
# HTTP 요청을 HTTPS로 리디렉션
return 301 https://$host$request_uri;
}
# steach-server를 위한 업스트림 설정
# 업스트림 서버: 'upstream' 지시어는 요청을 처리할 수 있는 백엔드 서버 풀을 정의합니다.
# 포트 번호에 18081 -> 8080 이면 8080을 써줘야한다.
upstream steach-server {
# server 43.202.1.52:8080;
# 여기서 43.202.1.52는 실제 IP 주소입니다.
# :8080은 steach-server 애플리케이션이 사용하는 포트 번호입니다.
# server steach-server:8080;
# 여기서 steach-server는 도메인 이름 또는 Docker 네트워크 내의 컨테이너 이름을 나타냅니다.
# 8080은 steach-server 애플리케이션이 사용하는 포트 번호입니다.
# [도메인 주소 43.202.1.52, 43.202.1.52 : 진짜 원래 포트 번호]
# 어떤 것을 사용해야 할까?
# 도메인 이름 또는 컨테이너 이름 (server steach-server:8080;)을 사용하는 것이 좋습니다.
# 특히 Docker 환경에서는 컨테이너 이름을 사용하면 Docker가 자동으로 네트워크 내에서 올바른 IP 주소를 찾아줍니다.
# 도메인 이름을 사용하면 서버의 IP 주소가 변경되더라도 도메인 이름을 통해 접근할 수 있습니다.
server steach-server:8080; # steach-server 애플리케이션이 사용하는 포트 설정
server 127.0.0.1:65535 backup; # 더미 서버
}
# Jenkins를 위한 업스트림 설정
upstream holy-jenkins {
server holy-jenkins:8080; # Docker Compose 네트워크와 Jenkins 서비스 포트 설정
server 127.0.0.1:65535 backup; # 더미 서버
}
server {
listen 443 ssl;
server_name 43.202.1.52;
# 이게 됬엇나..? 이게 안되서 아마 도커 nginx에서 local nginx로 바꿧던거 같음.
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
# 요청된 URI에 대해 가장 구체적인 location 블록을 선택
# location 블록의 종류 (위에서부터 우선순위가 높음)
# 정확한 경로 매칭 (=): 요청된 경로와 정확히 일치하는 경우에만 적용됩니다.
# 접두사 매칭 (^~): 주어진 문자열로 시작하는 경로에 대해 최우선으로 매칭합니다.
# 정규 표현식 매칭 (~, ~*): 정규 표현식을 사용하여 매칭합니다. ~는 대소문자를 구분하고, ~*는 대소문자를 구분하지 않습니다.
# 기본 매칭: 가장 일반적인 형태로, 주어진 문자열로 시작하는 모든 경로에 대해 매칭합니다.
# 이 설정은 클라이언트가 http://your-jenkins-server/jenkins/...로 요청을 보낼 때, Nginx가 이를 http://holy-jenkins/jenkins/...로 프록시한다는 것
# 깃허브 웹훅을 여기로 보내고 이 요청을 그대로 보내주면 되는건가..?
location /github-webhook {
# proxy_pass 지시어는 요청을 지정된 백엔드 서버로 전달합니다.
proxy_pass http://holy-jenkins; # 요청을 holy-jenkins 애플리케이션으로 전달
# proxy_set_header 지시어는 원본 요청의 헤더 정보를 유지하고 전달하는 데 사용됩니다.
proxy_set_header Host $host; # 원본 호스트 헤더 전달
proxy_set_header X-Real-IP $remote_addr; # 클라이언트의 IP 주소 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시를 통한 클라이언트 IP 주소 전달
proxy_set_header X-Forwarded-Proto $scheme; # 요청 프로토콜 전달
}
location /api {
proxy_pass http://steach-server; # 요청을 steach-server 애플리케이션으로 전달
proxy_set_header Host $host; # 원본 호스트 헤더 전달
proxy_set_header X-Real-IP $remote_addr; # 클라이언트의 IP 주소 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시를 통한 클라이언트 IP 주소 전달
proxy_set_header X-Forwarded-Proto $scheme; # 요청 프로토콜 전달
}
# 각 클라이언트 IP 주소별로 /api/v1/lectures/final/ 경로로 들어오는 요청 속도를 제한
# /api/v1/lectures/final/ 경로에 대한 요청을 처리합니다 (/api/v1/lectures/final/ ) 기능
# location /api/v1/lectures/final 는 (/api/v1/lectures/final ) 가능.
# 테스트도 포함
# 2개의 요청 같이 처리 (대소문자 구분)
location ~ ^/api/v1/(lectures/final/|check/server) {
# burst=0 은 에러가 나서 없애줘야함
# [이름] [적용 기술:nodelay, delay] burst: [순간 추가 허용 요청 허용 개수]
limit_req zone=ip_limit nodelay; # 요청 속도 제한 적용
limit_req_status 429; # 429 (Too Many Requests) 에러 반환
proxy_pass http://steach-server; # 요청을 steach-server 애플리케이션으로 전달
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-Proto $scheme;
}
# 상속 적용이 안됨.
location / {
proxy_pass http://steach-server; # 요청을 steach-server 애플리케이션으로 전달
proxy_set_header Host $host; # 원본 호스트 헤더 전달
proxy_set_header X-Real-IP $remote_addr; # 클라이언트의 IP 주소 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시를 통한 클라이언트 IP 주소 전달
proxy_set_header X-Forwarded-Proto $scheme; # 요청 프로토콜 전달
}
}
# 일반 로그 설정
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # main은 로그 형식을 지정하는 이름
error_log /var/log/nginx/error.log; # 경로 log_level # 기본 로그 레벨은 error입니다.
# 커스텀 로그 포맷 설정
log_format custom_log_format '$remote_addr - $remote_user [$time_local] "$request" '
'limit_req_status=$limit_req_status $status '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log custom_log_format;
}
# location /your_url {
# limit_req zone=one burst=5 nodelay;
# ...
# }
# # 특정 IP 주소에 대한 요청 제한 영역 정의
# limit_req_zone $binary_remote_addr zone=special_limit:10m rate=2r/s;
#
# # 특정 IP 주소에 대해 특별한 요청 제한을 적용하는 geo 지시어 설정
# geo $limit {
# default default_limit; # 기본적으로 default_limit 영역을 사용
# 192.168.1.100 special_limit; # 192.168.1.100 IP 주소에 대해 special_limit 영역을 사용
# }
# location에서 아래 처럼사용
# limit_req zone=$limit burst=5 nodelay;