nginx 부하 균형 + docker 배치 응용
17694 단어 docker
먼저 떠 오 르 는 방안 은 nginx 가 부하 균형 을 이 루 고 여러 대의 docker 방식 으로 프로젝트 를 배치 하 는 것 이다.생각 은 간단 하지만 진정 으로 조작 할 때 여러 가지 문제 에 부 딪 히 기 때문에 실천 이 가장 좋 은 선생님 이 라 고 할 수 있 습 니 다.
준비 docker
친구 들 에 게 아마 존의 클 라 우 드 를 테스트 환경 으로 빌 렸 다.
Linux ip-10-200-8-1044.9.20-11.31.amzn1.x86_64 #1 SMP Thu Apr 13 01:53:57 UTC 2017 x86_64 x86_64x86_64 GNU/Linux
docker 설치
yum 방식 으로 설치
yum install docker –y
docker 의 미 러 원본 설정
벽 에 걸 려 서 많은 docker 미 러 를 다운로드 할 수 없 을 것 같 습 니 다. docker 미 러 의 주 소 를 국내 주소 로 설정 할 수 있 습 니 다.사실은 간단 합 니 다. 다음 docker 의 프로필 을 바 꾸 면 됩 니 다./ etc / docker 디 렉 터 리 아래 에 daemon. json 파일 이 있 습 니 다. 수정 하면 됩 니 다.
cd /etc/docker vim daemon.json
다음 내용 으로 변경:
{
"registry-mirrors": [
"http://8fcab180.m.daocloud.io"
],
"insecure-registries": []
}
DockerFile 설정
프로젝트 는 struts 2 + my batis 기반 웹 프로젝트 로 Oacle 데이터베이스 와 redis 캐 시 를 사용 합 니 다.이러한 가로 확장 을 하려 면 session 공유 문 제 를 해결 해 야 합 니 다. 사용 하 는 spring session, 캐 시 는 당연히 redis 입 니 다. 이 부분 은 나중에 말씀 드 리 겠 습 니 다.
DockerFile 파일 설정 은 다음 과 같 습 니 다.
#docker linux
FROM ubuntu:14.04
MAINTAINER tonggu>
ENV REFRESHED_AT 2017-8-20
# tomcat7
RUN apt-get -yqq update
RUN apt-get -yqq install tomcat7default-jdk
# ( , oracle , )
RUN cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
date
# tomcat
ENV CATALINA_HOME /usr/share/tomcat7
ENV CATALINA_BASE /var/lib/tomcat7
ENV CATALINA_PID /var/run/tomcat7.pid
ENV CATALINA_SH /usr/share/tomcat7/bin/catalina.sh
ENV CATALINA_TMPDIR/tmp/tomcat7-tomcat7-tmp
RUN mkdir -p $CATALINA_TMPDIR
#
VOLUME["/var/lib/tomcat7/webapps/"]
# 8080
EXPOSE 8080
#docker tomcat
ENTRYPOINT["/usr/share/tomcat7/bin/catalina.sh", "run" ]
docker 시작 / 정지
docker 시작
sudo service docker start
멈추다
sudo service docker stop
docker 미 러 파일 구축
DockerFile 이 있 는 디 렉 터 리 로 전환 하고 다음 명령 을 수행 합 니 다.
sudo docker build -t ifa/erp-web .
이 명령 은 DockerFile 파일 을 통 해 ifa / erp - web 라 는 미 러 를 만 들 고 실행 할 명령 은 DockerFile 에 적 혀 있 습 니 다.
실행 이 완료 되면 미 러 를 볼 수 있 습 니 다.
sudo docker images
결과 보이 기:
REPOSITORY TAG IMAGE ID CREATED SIZE
ifa/erp-web latest 503a44ae7b40 21 hours ago 454 MB
docker 용기 실행
나 는 모두 두 개의 docker 용 기 를 배치 해서 두 개 를 작 동 시 켰 다.하 나 는 erp - web 1 이 고 하 나 는 erp - web 2 이 며 서버 의 8001 과 8002 포트 로 각각 용기 의 8080 포트 를 매 핑 합 니 다.
메모: / var / lib / docker / data 와 / var / lib / docker / logs 두 디 렉 터 리 를 미리 만들어 야 합 니 다. 그 중에서 / data 디 렉 터 리 는 발표 할 프로젝트 war 패 키 지 를 놓 습 니 다. 용기 에 있 는 / var / lib / tomcat 7 / webapps 디 렉 터 리 에 비치 기 때문에 용기 가 시 작 될 때 tomcat 의 webapps 디 렉 터 리 아래 에 놓 고 tomcat 가 시 작 될 때 자동 으로 발 표 됩 니 다. /logs 디 렉 터 리 는 로그 디 렉 터 리 로 로 로 그 를 보기 편 합 니 다.
sudo docker run -it -d --name erp-web1 -p 8001:8080 -v /var/lib/docker/data:/var/lib/tomcat7/webapps -v /var/lib/docker/logs:/logs ifa/erp-web ubuntu /bin/bash
sudo docker run -it -d --name erp-web2 -p 8002:8080 -v /var/lib/docker/data2:/var/lib/tomcat7/webapps -v /var/lib/docker/logs2:/logs ifa/erp-web ubuntu /bin/bash
위의 두 명령 은 두 개의 docker 용 기 를 시작 합 니 다. 하 나 는 erp - web 1 이 고 하 나 는 erp - web 2 입 니 다. 아래 명령 을 통 해 볼 수 있 습 니 다.
sudo docker ps
결과 보이 기:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b02d455b3393 ifa/erp-web "/usr/share/tomcat..." 19 hours ago Up 42 minutes 1521/tcp, 9000/tcp,0.0.0.0:8002->8080/tcp erp-web2
473cb6b2837c ifa/erp-web "/usr/share/tomcat..." 19 hours ago Up 42 minutes 1521/tcp, 9000/tcp, 0.0.0.0:8001->8080/tcp erp-web1
지금까지 docker 의 시작 이 완료 되 었 고 프로젝트 도 정상적으로 접근 할 수 있 습 니 다.
접근 주소:http://ec2-54-223-252-143.cn-north-1.compute.amazonaws.com.cn:8001/erp-web/welcome.html http://ec2-54-223-252-143.cn-north-1.compute.amazonaws.com.cn:8002/erp-web/welcome.html
다음은 nginx 를 설정 하고 nginx 는 8080 포트 를 사용 한 다음 에 부하 균형 과 역방향 대 리 를 통 해 위의 두 주소 에 투사 합 니 다.
준비 nginx
설치 nginx
여전히 yum 설치 방식 을 채택 하 다
yum install nginx –y
설정 nginx
프로필 수정 / etc / nginx / nginx. conf
#For more information on configuration,see:
#*Official English Documentation: http://nginx.org/en/docs/
#*Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
sendfile on;
#tcp_nopush on;
#
keepalive_timeout 65;
tcp_nodelay on;
# gzip
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#
#client_header_buffer_size 1k;
#large_client_header_buffers 44k;
client_body_buffer_size 1024k;
client_max_body_size 100m;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
upstream www.tonggu.com {
server localhost:8001;
server localhost:8002;
}
server {
# 8080
listen 8080;
server_name localhost;
index welcome.html;
#
location / {
root /var/lib/docker/data;
expires 30d;
}
# ,nginx
location ~ ^/(images|javascript|js|css|flash|media|static)/{
root /var/lib/docker/data;
# 30 , , , , 。
expires 30d;
}
# ,nginx
location ~ ^/(upload)/ {
root /var/lib/docker/data;
# 30 , , , , 。
expires 30d;
}
# tomcat
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|mp3|apk|doc|xls)$
{
root /var/lib/docker/data;
expires 30d;
}
# tomcat
location ~ \.whtml$ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_headerX-Real-IP $remote_addr;
proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
proxy_passhttp://www.tonggu.com;
}
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
시작 nginx
시동 을 걸다
sudo service start nginx
멈추다
sudo service stop nginx
프로필 다시 불 러 오기
sudo nignx –s reload
현재 아래 주 소 를 통 해 접근 할 수 있 습 니 다:http://ec2-54-223-252-143.cn-north-1.compute.amazonaws.com.cn:8080/erp-web/welcome.html
이로써 nginx + docker 의 설정 이 완료 되 었 습 니 다. 이 설정 은 복잡 하지 않 습 니 다. 물론 작업 과정 에서 주로 미 러 소스 와 데이터 베 이 스 를 연결 할 수 없 는 데 시간 을 썼 습 니 다. 앞 에 이 구덩이 와 해결 방법 이 표시 되 어 있 습 니 다.
세 션 공유 파일 및 솔 루 션
세 션 공유 문 제 를 어떻게 해결 하 는 지, 먼저 생각 나 는 것 은 spring session 으로 공유 문 제 를 해결 하 는 것 이다.사실 현재 많은 항목 들 이 앞 뒤 단 분 리 를 하고 있 습 니 다. 일반적으로 http 헤드 에 token 을 추가 하 는 방식 으로 서로 다른 사용자 의 서로 다른 증빙 문 제 를 해결 합 니 다.물론 쿠키 로 도 해결 할 수 있 고 spring session 은 모두 해결 할 수 있 습 니 다.
spring session 의 설정 과 원래 인터넷 에 많이 있 었 는데 여기 서 제 가 겪 은 문 제 를 주로 말씀 드 리 겠 습 니 다.
첫 번 째 설정 을 할 때 docker 에 있 는 서 비 스 를 직접 되 돌려 주 는 것 이 유효 합 니 다. nginx 를 통 해 효력 이 발생 하지 않 았 을 때 처음에 저 는 nginx 의 문제 라 고 생각 하여 session 을 잃 어 버 렸 지만 nginx 를 통 해 단일 docker 를 연결 하 는 것 은 유효 합 니 다.(내 가 있 는 이곳 의 효력 은 주로 항목 이 비교적 특수 해서 효력 이 발생 하지 않 을 때 로그 인 할 수 있 지만 홈 페이지 에 들 어 갈 수 없다. 또한 효력 이 발생 할 때 redis 에서 spring 이 넣 은 key 를 볼 수 있 고 효력 이 발생 하지 않 을 때 볼 수 없다.)
다음은 나의 설정:
웹. xml 설정:
>
-name>springSessionRepositoryFilter -name>
-class>org.springframework.web.filter.DelegatingFilterProxy -class>
>
-mapping>
-name>springSessionRepositoryFilter -name>
-pattern>/* -pattern>
>REQUEST >
>ERROR >
-mapping>
HttpSessionConfig.java
@EnableRedisHttpSession
public class HttpSessionConfig {
}
application-redis.xml
:annotation-config/>
:component-scanbase-package="com.saier.erp"/>
<!-- redis -->
>
나중에 spring session 과 server let 의 원 리 를 보 았 습 니 다. spring session 은 본질 적 으로 filter 를 추가 하여 filter 에서 session 을 처리 합 니 다. 그러면 이 filter 는 첫 번 째 에 설정 해 야 합 니 다. 여러 개의 filter 가 있다 면.
그래서 필터 의 위 치 를 첫 번 째 로 조정 했다.호출 순 서 를 보면 listener - > filter - > interceptor 입 니 다. 제 가 listener 와 interceptor 에서 session 에 사용 되 는 것 을 발 견 했 습 니 다.filter 는 listener 뒤에 있 기 때문에 listener 에 서 는 spring session 이 설정 한 session 내용 을 찾 을 수 없 으 며, interceptor 는 가능 합 니 다.그래서 listener 에서 session 을 가 져 온 내용 을 interceptor 로 옮 겨 처리 합 니 다.
그리고 시동 걸 때 다음 과 같은 오 류 를 보고 하면 다음 과 같은 말 을 덧 붙 이면 됩 니 다.
오류 내용:
org.springframework.beans.factory.NoSuchBeanDefinitionException:No bean named ‘springSessionRepositoryFilter’ is defined
추가 설정:
:component-scanbase-package="org.springframework.web.filter.DelegatingFilterProxy"/>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swarm의 도커 비밀이 게시물에서는 Redis를 사용한 실제 시나리오 예제를 제공하여 사용 방법을 보여주고자 합니다. Docker 기술에 대한 기본 지식 Docker Swarm 오케스트레이터에 대한 기본 지식 "Docker Swarm ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.