摘要:命令可以刪除指定容器下面正式配置上面三個(gè)場(chǎng)景場(chǎng)景靜態(tài)資源代理在目錄下創(chuàng)建目錄并上傳靜態(tài)資源修改文件是不是。
鏡像安裝
可以通過以下命令拉取nginx和tomcat鏡像作為測(cè)試
[root@docker /]# docker pull nginx [root@docker /]# docker pull tomcatnginx
鏡像下載完后,執(zhí)行以下命令啟動(dòng)nginx
[root@docker /]# docker run --name=my_nginx -p 8000:80 -d nginx
--name: 為nginx容器指定一個(gè)名稱方便管理
-p: 將nginx內(nèi)部80端口代理到宿主機(jī)8000端口,可以通過宿主機(jī):8000訪問nginx 80端口
-d: 后臺(tái)運(yùn)行
可以通過docker ps 命令查看容器運(yùn)行情況
[root@docker /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1833fcff605b nginx "nginx -g "daemon off" 2 minutes ago Up 2 minutes 0.0.0.0:8000->80/tcp my_nginx
瀏覽器訪問http://192.168.43.32:8000/查看是否能夠訪問,或者使用curl命令(推薦)
[root@docker /]# curl http://192.168.43.32:8000nginx配置文件Welcome to nginx! ....
進(jìn)入nginx容器后臺(tái)
[root@docker /]# docker exec -it my_nginx bash root@1833fcff605b:/# cd /etc/nginx/ root@1833fcff605b:/etc/nginx# ls -l total 36 drwxr-xr-x. 2 root root 26 Dec 26 18:16 conf.d -rw-r--r--. 1 root root 1007 Dec 26 11:11 fastcgi_params -rw-r--r--. 1 root root 2837 Dec 26 11:11 koi-utf -rw-r--r--. 1 root root 2223 Dec 26 11:11 koi-win -rw-r--r--. 1 root root 5170 Dec 26 11:11 mime.types lrwxrwxrwx. 1 root root 22 Dec 26 11:11 modules -> /usr/lib/nginx/modules -rw-r--r--. 1 root root 643 Dec 26 11:11 nginx.conf -rw-r--r--. 1 root root 636 Dec 26 11:11 scgi_params -rw-r--r--. 1 root root 664 Dec 26 11:11 uwsgi_params -rw-r--r--. 1 root root 3610 Dec 26 11:11 win-utf
nginx.conf是nginx主要配置文件,可以通過more命令查看nginx.conf(容器默認(rèn)不安裝vi工具)
root@1833fcff605b:/etc/nginx# more nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/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; #gzip on; include /etc/nginx/conf.d/*.conf; }
注意到最后一行配置
include /etc/nginx/conf.d/*.conf;
include可以將其他配置文件導(dǎo)入,進(jìn)入/etc/nginx/conf.d/目錄下查看
root@1833fcff605b:/etc/nginx# cd /etc/nginx/conf.d/ root@1833fcff605b:/etc/nginx/conf.d# ls default.conf
default.conf
root@1833fcff605b:/etc/nginx/conf.d# more default.conf server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ .php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache"s document root # concurs with nginx"s one # #location ~ /.ht { # deny all; #} }
#表示注釋可以忽略
server:代表虛擬服務(wù)器,下面會(huì)解釋什么是虛擬服務(wù)器
server_name:服務(wù)器名稱
location:訪問路徑匹配規(guī)則,這也是nginx最靈活的地方,可以使用正則表達(dá)式
解釋下什么是虛擬服務(wù)器
如果給nginx服務(wù)器在dns上配置兩個(gè)域名
domain1.nginx.com
domain2.nginx.com
用戶訪問這兩個(gè)域名,你可能希望他們?cè)L問同一個(gè)后臺(tái)服務(wù),也可能希望訪問不同的后臺(tái)服務(wù)
那么在nginx里就可以配置兩個(gè)虛擬服務(wù)器也就是兩個(gè)server節(jié)點(diǎn)
server { listen 80; server_name domain1.nginx.com; ... } server { listen 80; server_name domain2.nginx.com; ... }
兩個(gè)虛擬服務(wù)器監(jiān)聽同一個(gè)端口80.nginx可以根據(jù)用戶訪問的host(http頭部host)字段代理到不同服務(wù)器上
location->root:靜態(tài)資源目錄,web靜態(tài)資源如圖片,js,html可通過該方式存放
location->index:如用戶未指定請(qǐng)求資源名稱,默認(rèn)訪問index指定的文件,如訪問http://host:port/html/則默認(rèn)訪問http://host:port/html/index.html
我們假設(shè)有以下三個(gè)場(chǎng)景
場(chǎng)景1
宿主機(jī)有個(gè)目錄存儲(chǔ)靜態(tài)資源,需要通過nginx代理出去,用戶訪問http://host:port/resource/xxxx訪問
場(chǎng)景2
tomcat服務(wù)器(docker容器)上運(yùn)行一個(gè)web程序,需要通過nginx代理出去,web程序context root為WebTestApp
場(chǎng)景3
該web程序運(yùn)行在兩個(gè)tomcat容器中,需要通過nginx做負(fù)載均衡
nginx配置文件掛載docker容器每次重啟都是一個(gè)新的環(huán)境,也就是說在docker容器內(nèi)做的任何修改都將被還原,但nginx的配置文件是在docker容器內(nèi),我們?nèi)绻苯舆M(jìn)行修改每次重啟后都會(huì)被還原,這并不是我們所希望的,所以首先需要將配置文件從docker容器中"搬到"宿主機(jī)上,這里會(huì)通過docker的卷(volume)實(shí)現(xiàn)。
volume可以將本地文件掛載到docker容器內(nèi),這樣容器重啟后信息不會(huì)丟失
對(duì)于nginx,可以將nginx.conf文件和conf.d目錄從容器內(nèi)部"搬"出來
在本地創(chuàng)建nginx.conf文件和conf.d目錄
[root@docker /]# mkdir -p /u01/nginx [root@docker /]# mkdir -p /u01/nginx/conf.d [root@docker /]# touch /u01/nginx/nginx.conf [root@docker /]# touch /u01/nginx/conf.d/default.conf
nginx.conf文件和default.conf內(nèi)容可以直接從容器內(nèi)部復(fù)制
nginx.confuser nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/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; #gzip on; include /etc/nginx/conf.d/*.conf; }default.conf
server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ .php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache"s document root # concurs with nginx"s one # #location ~ /.ht { # deny all; #} }
重新啟動(dòng)nginx
[root@docker /]# docker stop my_nginx my_nginx [root@docker /]# docker rm my_nginx my_nginx [root@docker nginx]# docker run --name=my_nginx -v /u01/nginx/nginx.conf:/etc/nginx/nginx.conf -v /u01/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 -d nginx 6efe91858f071a50197da104cdccf8500234f1bf6d0f4f56d3dc5de02261272c [root@docker /]# curl http://192.168.43.32:8000Welcome to nginx! ....
注意到執(zhí)行了一個(gè) docker rm my_nginx 命令,這是因?yàn)槿萜髅看螁?dòng)需要指定不同的名字,一個(gè)名字不能使用多次,可以通過 docker ps -a查看所有容器,包括未運(yùn)行的容器。rm命令可以刪除指定容器
下面正式配置上面三個(gè)場(chǎng)景
在u01目錄下創(chuàng)建目錄resource,并上傳靜態(tài)資源
[root@docker resource]# pwd /u01/resource [root@docker resource]# ll total 164 -rw-r--r--. 1 root root 147291 Oct 8 2015 angular.min.js -rw-r--r--. 1 root root 17189 Nov 3 10:32 docker.jpg [root@docker resource]#
修改/u01/nginx/conf.d/default.conf文件
default.confserver { listen 80; server_name localhost; location /resource { root /u01; index index.html index.htm; } }
ps:root是/u01不是/u01/resource。如果root配置成/u01/resource/則nginx會(huì)去/u01/resource/resource目錄下尋找文件
重新啟動(dòng)nginx容器,將resource目錄掛載到容器內(nèi)部
[root@docker u01]# docker stop my_nginx my_nginx [root@docker u01]# docker rm my_nginx my_nginx [root@docker u01]# docker run --name=my_nginx -v /u01/nginx/nginx.conf:/etc/nginx/nginx.conf -v /u01/nginx/conf.d:/etc/nginx/conf.d -v /u01/resource:/u01/resource -p 8000:80 -d nginx
訪問
http://192.168.43.32:8000/resource/docker.jpg
http://192.168.43.32:8000/resource/angular.min.js
測(cè)試配置是否成功(將上面ip替換成宿主機(jī)ip)
準(zhǔn)備一個(gè)servet作為測(cè)試
package com.df.demo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; public class WebTestService extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=UTF-8"; public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.print("hello docker tomcat"); out.close(); } }
打成war包,包名為WebTestApp.war,在u01上創(chuàng)建webapps目錄并上傳war包
[root@docker webapps]# pwd /u01/webapps [root@docker webapps]# ls WebTestApp.war
啟動(dòng)tomcat容器,并將/u01/webapps目錄掛載到tomcat的/usr/local/tomcat/webapps目錄下
[root@docker ~]# docker run --name=my_tomcat1 -v /u01/webapps:/usr/local/tomcat/webapps -p 8001:8080 -d tomcat [root@docker ~]# curl http://localhost:8001/WebTestApp hello docker tomcat
程序已經(jīng)成功部署到tomcat上
修改/u01/nginx/conf.d/default.conf文件
server { listen 80; server_name localhost; location / { proxy_pass http://tomcat_server; } }
修改/u01/nginx/nginx.conf在http配置節(jié)點(diǎn)中增加以下配置
upstream tomcat_server { server t1:8080; }
upstream 可以定義一組服務(wù)器
proxy_pass 設(shè)置代理的服務(wù)器,格式為http://upstream_name
重啟nginx容器,這里我們需要使用一個(gè)新的docker參數(shù)--link
[root@docker u01]# docker run --name=my_nginx1 --link=my_tomcat1:t1 -v /u01/nginx/nginx.conf:/etc/nginx/nginx.conf -v /u01/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 -d nginx [root@docker ~]# curl http://192.168.43.32:8000/WebTestApp hello docker tomcat
ps:這里換了一個(gè)名字my_nginx1,用原來的名字my_nginx無法啟動(dòng)容器,會(huì)報(bào)以下錯(cuò)誤
2018/01/27 08:40:44 [emerg] 1#1: host not found in upstream "t1:8080" in /etc/nginx/nginx.conf:30 nginx: [emerg] host not found in upstream "t1:8080" in /etc/nginx/nginx.conf:30
t1無法找到,但如果不使用--name指定名稱可正常啟動(dòng),原因未知。
link參數(shù)可以在兩個(gè)容器之間建立網(wǎng)絡(luò)連接,格式為--link=my_tomcat1:t1 my_tomcat1為容器名稱,t1為取的別名
可登錄nginx容器查看/etc/hosts文件,docker會(huì)將t1加入到hosts文件中
[root@docker ~]# docker exec -it my_nginx1 bash root@fa5f782b9448:/# more /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.5 t1 1f9b1d432ab0 my_tomcat1 172.17.0.6 fa5f782b9448場(chǎng)景3-tomcat負(fù)載均衡
修改/u01/nginx/nginx.conf在場(chǎng)景2的基礎(chǔ)上增加新的服務(wù)器
upstream tomcat_server { server t1:8080; server t2:8080; }
在啟動(dòng)一個(gè)tomcat容器my_tomcat2
[root@docker ~]# docker run --name=my_tomcat2 -v /u01/webapps:/usr/local/tomcat/webapps -d tomcat
重啟nginx
[root@docker /]# docker stop my_nginx1 [root@docker /]# dcoker rm my_nginx1 [root@docker /]# docker run --name=my_nginx1 --link=my_tomcat1:t1 --link=my_tomcat2:t2 -v /u01/nginx/nginx.conf:/etc/nginx/nginx.conf -v /u01/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 -d nginx [root@docker ~]# curl http://192.168.43.32:8000/WebTestApp hello docker tomcat
可以分別登錄兩個(gè)tomcat容器查看access.log可以查看結(jié)果,nginx在兩臺(tái)服務(wù)器之間做輪詢.輪詢是nginx默認(rèn)的負(fù)載均衡方式。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39950.html
摘要:以及自動(dòng)剔除因故障負(fù)載均衡列表中宕機(jī)的服務(wù)器。這兩天折騰了一下的安裝配置,并通過模擬出在多服務(wù)器提供服務(wù)的狀態(tài)下的負(fù)載均衡。修改好配置文件后,使用重新載入配置。 原文發(fā)表于我的博客,轉(zhuǎn)載請(qǐng)注明出處 一直聽說Nginx的強(qiáng)大,它不僅可以作為Web服務(wù)器,按照調(diào)度規(guī)則實(shí)現(xiàn)動(dòng)態(tài)、靜態(tài)頁面的分離;還可以作為反向代理服務(wù)器,構(gòu)建服務(wù)集群,按輪詢、權(quán)重等多種方式對(duì)后端服務(wù)器做負(fù)載均衡。以及自動(dòng)剔...
摘要:以及自動(dòng)剔除因故障負(fù)載均衡列表中宕機(jī)的服務(wù)器。這兩天折騰了一下的安裝配置,并通過模擬出在多服務(wù)器提供服務(wù)的狀態(tài)下的負(fù)載均衡。修改好配置文件后,使用重新載入配置。 原文發(fā)表于我的博客,轉(zhuǎn)載請(qǐng)注明出處 一直聽說Nginx的強(qiáng)大,它不僅可以作為Web服務(wù)器,按照調(diào)度規(guī)則實(shí)現(xiàn)動(dòng)態(tài)、靜態(tài)頁面的分離;還可以作為反向代理服務(wù)器,構(gòu)建服務(wù)集群,按輪詢、權(quán)重等多種方式對(duì)后端服務(wù)器做負(fù)載均衡。以及自動(dòng)剔...
摘要:命令可以刪除指定容器下面正式配置上面三個(gè)場(chǎng)景場(chǎng)景靜態(tài)資源代理在目錄下創(chuàng)建目錄并上傳靜態(tài)資源修改文件是不是。 鏡像安裝 可以通過以下命令拉取nginx和tomcat鏡像作為測(cè)試 [root@docker /]# docker pull nginx [root@docker /]# docker pull tomcat nginx 鏡像下載完后,執(zhí)行以下命令啟動(dòng)nginx [root@do...
閱讀 2391·2023-04-25 19:27
閱讀 3501·2021-11-24 09:39
閱讀 3917·2021-10-08 10:17
閱讀 3407·2019-08-30 13:48
閱讀 1940·2019-08-29 12:26
閱讀 3131·2019-08-28 17:52
閱讀 3545·2019-08-26 14:01
閱讀 3542·2019-08-26 12:19