nginx 부하 균형 + docker 배치 응용

17694 단어 docker
Docker 가 나 온 지 오래 되 었 습 니 다. 연구 할 시간 이 없 었 습 니 다. 마침 최근 에 메모리 와 CPU 가 모두 과장된 기계 에 배 치 된 프로젝트 가 있 었 습 니 다. 프로젝트 는 병발 량 이 증가 하기 때문에 그 후에 도 확장 이 필요 할 것 입 니 다.이 서버 의 메모리 와 CPU 가 충분 하기 때문에 하나의 항목 을 배치 하 는 것 은 너무 낭비 되 기 때문에 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"/>

좋은 웹페이지 즐겨찾기