1. 程式人生 > >nginx負載均衡+docker部署應用

nginx負載均衡+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

專案是基於struts2+mybatis的web專案,用到oracle資料庫和redis快取。因為要做這種橫向擴充套件所以要解決session共享問題,用的spring session,快取自然也是redis,這塊後面再講。

DockerFile檔案配置如下:

#docker容器使用linux系統

FROM ubuntu:14.04

MAINTAINER tonggu<[email protected]>

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-web1,一個是erp-web2,然後用伺服器的8001和8002埠分別對映容器的8080埠。

注意:/var/lib/docker/data和/var/lib/docker/logs這兩個目錄要預先建立,其中/data目錄放要釋出的專案war包,因為對映到了容器中的/var/lib/tomcat7/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:/logsifa/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-web1,一個是erp-web2,可以通過下面的命令檢視。

sudodocker 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的啟動了,專案也可以正常訪問了。

訪問地址:

接下來就是要配置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;

       #定義使用www.xx.com訪問

       server_name  localhost;

       index        welcome.html;

       #設定本虛擬主機的訪問日誌

       #access_log  logs/www.wangjingfeng.com.access.log  main;

                       #預設請求

                       #location / {

              #proxy_redirect off;

                                         #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_pass http://www.tonggu.com;

                    #}

           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;

       }       

                       #PHP 指令碼請求全部轉發到 FastCGI處理. 使用FastCGI預設配置.

                       location ~ \.whtml$ {

                        #set $args"iface-server";

                          #proxy_redirectoff;

                           #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

現在通過以下地址就能訪問了:

至此已經完成了nginx+docker的配置,這個配置不算複雜,當然在操作過程中主要把時間花在解決映象源上和資料庫無法連線上,前面已經標記出了這些坑及解決方法。

Session共享檔案及解決方案

下面講下如何解決session共享問題,首先想到的就是用spring session解決共享問題。其實現在很多專案都做前後端分離,一般都是採用在http頭中新增token的方式來解決不同使用者不同憑證的問題。當然也可以採用cookie的方式來解決,而spring session都能解決。

關於spring session的配置及其原來在網上有很多,這裡主要講下我碰到的問題。

第一次配置的時候直接返回docker裡面的服務是生效的,當通過nginx卻不生效,開始我以為是nginx的問題,導致session丟失,但通過nginx連線單臺docker卻是生效的。(我這裡的生效主要是專案比較特殊,不生效的時候可以登入,但進不了主頁。另外生效的時候在redis裡面可以看到spring放進去的key,未生效的時候看不到。)

以下是我的配置:

web.xml的配置:

<filter>

<filter-name>springSessionRepositoryFilter</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>

<filter-mapping>

<filter-name>springSessionRepositoryFilter</filter-name>

<url-pattern>/*</url-pattern>

<dispatcher>REQUEST</dispatcher>

<dispatcher>ERROR</dispatcher>

</filter-mapping>

HttpSessionConfig.java

@EnableRedisHttpSession

publicclass HttpSessionConfig {

}

application-redis.xml

<context:annotation-config/>

<context:component-scanbase-package="com.saier.erp"/>

<!-- 建立redis工廠 -->

<beanid="jedisFactory"       class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

<propertyname="hostName"value="XXX.XXX.XXX.XXX"/>

<propertyname="port"value="6379"/>

<propertyname="usePool"value="true"/>

</bean>

後來看了下spring session及其servelet的原理,spring session本質上是加了一層filter,在filter裡面處理session,這樣的話這個filter必須配置在第一個,如果有多個filter的話。

於是調整了下filter的位置放到了第一個。再看呼叫順序是listener——>filter——>interceptor,發現我在listener和interceptor裡面有使用到session的東西。而因為filter在listener之後,所以在listener裡面是取不到spring session設定的session內容的,而interceptor可以。於是把listener裡面獲取session的內容挪到interceptor裡面再處理

其他還有就是啟動的時候報如下錯誤的話加上下面這句就可以了。

錯誤內容:

新增配置:

<context:component-scanbase-package="org.springframework.web.filter.DelegatingFilterProxy"/>

相關推薦

nginx負載均衡+docker部署應用

Docker已經出來好長時間了,一直沒有時間研究,正好最近有個專案部署在一臺記憶體和CPU都超誇張的機器上,而專案因併發量增加,後面肯定也需要擴充套件了。因為這臺伺服器記憶體和CPU都足夠大,部署一個專案實在太浪費了,於是想到用docker部署方式做橫向擴充套件。 首先想到

NGINX 負載均衡原理及應用

Nginx負載均衡與可用性檢查 在業界,一直流傳這樣一句話:Nginx抗併發能力強!為什麼Nginx抗併發能力強?原因是使用了非阻塞、非同步傳輸阻塞:如apache代理tomcat時,apache開啟10個程序,同時處理著10個請求,在tomcat沒有返回給apache結果

Tomcat部署+Nginx負載均衡群集

tomcat nginx Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器在中小型系統和並發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。下文中java的包,簡稱為jdk通過 wget下載jdk的tar包wget jdk本地有可以直接配置,有

nginx負載均衡和mysql主主被動模式基礎架構綜合部署

nginx負載均衡 mysql主從(主主被動互備模式) 1.結構思路 準備用5個虛機,一個虛機安裝nginx來配置負載均衡,兩個虛機做web服務器,另外兩個虛機,安裝mysql,做主主被動配置,每次web只讀取一個mysql服務。 2.具體實施步驟 用vmware最小化安裝5個虛機,我用的是c

CentOS 7.3 部署Tomcat + nginx 負載均衡

行修改 .sh 安裝jdk 一個 wall 語言 rec image java環境 實施準備 關閉防火墻,安全性增強功能 準備要有三臺 centos 其中兩個centos 上搭建 tomcat8 另一臺上搭建nginx 還以一臺Windows 來進行訪問 systemct

docker搭建nginx負載均衡測試環境

昨天收了一篇好文章 nginx常用功能全揭祕,想著今天來按照步驟配置一下nginx代理的,結果在使用docker的時候一直出問題,才誕生了這篇關於docker配置nginx負載均衡。 首先在宿主機上建立兩個兩個目錄n1,n2,分別作為兩臺nginx伺服器的目錄。 mkdir -p n1 n2

[Demo實踐]使用Docker測試nginx負載均衡策略

實踐環境: linux主機,已安裝docker 步驟1: 下載伺服器映象,此處直接選擇nginx docker pull nginx 步驟2: 啟動5個容器,分別命名n1~n5,並暴露埠8071 ~ 8075 docker run --name n1 -d -p 8071:80 ng

使用nginx負載均衡web應用

安裝 首先需要在系統上安裝nginx軟體,這裡使用Ubuntu的apt來安裝。 sudo apt-get install nginx 配置 安裝完成後,我們首先需要修改一個ngins的配置。 這裡假定我們已經有了個兩個相同的web應用,分別使用的 8081 和 80

nginx結合tomcat實現反向代理和負載均衡部署

部署環境:CentOS6.5   nginx1.8     tomcat7 下載nginx地址:http://nginx.org/en/download.html nginx安裝 1.安裝時依賴環境:yum -y install make gcc-c++ zlib zlib

nginx負載均衡教程之從不用root編譯開始! + flask + uwsgi 部署高併發網路服務!

編譯使用nginx without root! 之前閱讀了很過國內的部落格,對nginx在linux下的使用都是一筆帶過,這個給後面的使用造成了很大的麻煩!尤其是在不用root怎麼安裝這塊!本部分詳細的講解,供新人使用!此處參考了一個國外人的[wiki

使用Nginx負載均衡搭建高效能.NETweb應用程式一

五、Ngnix如何處理一個請求?      當Nginx啟動時,先會解析我們配置的檔案,得到監聽的埠和Ip地址,master程序就會初始化這個建庫的socket通訊,然後再fork,master呼叫fork函式建立一個新的程序,由fork建立的新程序被稱為子程序,然後這些worker會競爭去接受的新的連線,此

Nginx + Tomcat 反向代理 負載均衡 叢集 部署指南

Nginx是一種伺服器軟體,也是一種高效能的http和反向代理伺服器,同時還是一個代理郵件伺服器。也就是說,我們在Nginx上可以釋出網站,可以實現負載均衡(提高應答效率,避免伺服器崩潰),還可以作為郵件伺服器實現收發郵件等功能。而最常見的就是使用Nginx實現負載均衡。

docker上配置nginx負載均衡

name ash bash send listen buffer erro lan catalina 采用ubuntu系統,docker安裝自行百度 1.安裝tomcat docker run -d -p 8088:8080 tomcat docker run -

nginx負載均衡配置

war eal ade remote dock lis upstream doc 配置 http {   upstream docker {       server 192.168.88.106:10001;       server 192.168.88.1

【轉】淺談一個網頁打開的全過程(涉及DNS、CDN、Nginx負載均衡等)

位置 filters 產生 多種方法 tps windows cnblogs 這就是 廣東 1、概要   從用戶在瀏覽器輸入域名開始,到web頁面加載完畢,這是一個說復雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁加載過程。下面我將依靠自己的經驗,總結一下整個過程

BasePath問題-nginx負載均衡配置

.... class ip地址 htm post 細致 rpo 均衡 css 在配置nginx+tomcat好後。將項目加入到webapps中。發現訪問主頁時,css與js訪問不到,導致主頁布局出錯。細致分析原因後發現css與js的地址是basePath得出的。而bas

tomcat+nginx負載均衡群集

負載均衡群集線上環境Nginx+Tomcat網站拓撲架構服務器軟件要求:主機 IP地址 主要軟件 Nginx服務器192.168.1.102 nginx-1.6.0.tar.gz Tomcat1 192.168.1.100 1.jdk-7u65-linux-x64.gz 2.apache-tomcat-

Nginx負載均衡+Keepalived高可用集群

check list proxy www alived 編譯安裝nginx efi class request 一、搭建環境及軟件版本 負載均衡:Nginx 高可用:Keepalived Linux:Centos 6.5 Nginx:nginx-1.6.2 Keepaliv

tomcat+nginx負載均衡

col rec 80端口 get tom 127.0.0.1 核數 worker div 一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目標   實現高性能負載均衡的Tomcat集群:    三、 步驟

nginx負載均衡簡單配置

.org star gin def lis down pes timeout install nginx負載均衡簡單配置準備三臺虛擬機來做這個實驗:172.16.160.99 web服務器172.16.160.103 web服務器172.16.160