Nginx+Apache+Tomcat實現LANMT動靜分離
目的:
本次實驗主要目的為實現以Nginx作為反向代理,并實現分別訪問動靜態服務的效果。
拓撲結構:
client 172.16.0.1 –> nginx webproxy1,IP:172.16.10.10 –> httpd+tomcat web1,IP: 172.16.100.101 –> DB: maridDB IP: 172.16.200.200
–> httpd ,web2,IP: 172.16.100.102
具體實現:
1.webproxy1配置
##安裝nginx
[root@webproxy1 setup]# tar xzvf nginx-1.9.9.tar.gz
[root@webproxy1 setup]# cd nginx-1.9.9
[root@webproxy1 nginx-1.9.9]# ./configure –prefix=/usr/local/nginx –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx/nginx.pid –lock-path=/var/lock/nginx.lock –user=www –group=www –with-http_v2_module –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –http-client-body-temp-path=/var/tmp/nginx/client/ –http-proxy-temp-path=/var/tmp/nginx/proxy/ –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –http-scgi-temp-path=/var/tmp/nginx/scgi –with-pcre
[root@webproxy1 nginx-1.9.9]# make && make install
##啟動測試
[root@webproxy1 nginx]# nginx
[root@webproxy1 nginx]# ss -ntlp | grep nginx
LISTEN 0 128 *:80 *:*
users:(("nginx",pid=4981,fd=6),("nginx",pid=4980,fd=6))
[root@webproxy1 nginx]#
[root@webproxy1 nginx]# curl -I http://172.16.10.10
HTTP/1.1 200 OK
Server: nginx/1.9.9
Date: Mon, 28 Nov 2016 06:37:14 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Fri, 18 Nov 2016 01:15:59 GMT
Connection: keep-alive
ETag: "582e564f-264"
Accept-Ranges: bytes
##訪問正常
2.web1配置
##安裝jdk
[root@web1 /]# yum install -y java-1.8.0-openjdk
##檢查驗證
[root@web1 /]# java -version
openjdk version "1.8.0_20"
OpenJDK Runtime Environment (build 1.8.0_20-b26)
OpenJDK 64-Bit Server VM (build 25.20-b23, mixed mode)
[root@web1 /]#
##安裝tomcat
[root@web1 setup]# tar xzvf apache-tomcat-8.5.8.tar.gz -C /usr/local/
[root@web1 setup]# cd /usr/local
[root@web1 local]# ls
apache-tomcat-8.5.8 bin etc games include lib lib64 libexec sbin share src
[root@web1 local]#
[root@web1 local]# ln -sv apache-tomcat-8.5.8/ tomcat
`tomcat' -> `apache-tomcat-8.5.8/'
You have new mail in /var/spool/mail/root
[root@web1 local]#
[root@web1 tomcat]# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat/
export PATH=$CATALINA_HOME/bin:$PATH
[root@web1 tomcat]# . /etc/profile.d/tomcat.sh
##檢查驗證
[root@web1 tomcat]# catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat/
Using CATALINA_HOME: /usr/local/tomcat/
Using CATALINA_TMPDIR: /usr/local/tomcat//temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat//bin/bootstrap.jar:/usr/local/tomcat//bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.8
Server built: Nov 3 2016 21:14:13 UTC
Server number: 8.5.8.0
OS Name: Linux
OS Version: 2.6.32-504.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_20-b26
JVM Vendor: Oracle Corporation
[root@web1 tomcat]#
##啟動
[root@web1 tomcat]# catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat/
Using CATALINA_HOME: /usr/local/tomcat/
Using CATALINA_TMPDIR: /usr/local/tomcat//temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat//bin/bootstrap.jar:/usr/local/tomcat//bin/tomcat-juli.jar
Tomcat started.
[root@web1 tomcat]#
[root@web1 tomcat]# ss -ntlp | grep java
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",5464,75))
LISTEN 0 100 :::8009 :::* users:(("java",5464,53))
LISTEN 0 100 :::8080 :::* users:(("java",5464,48))
[root@web1 tomcat]#
##檢查驗證
[root@web1 tomcat]# curl -I http://172.16.100.101:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 28 Nov 2016 10:04:35 GMT
[root@web1 tomcat]#
##編譯安裝httpd##
[root@web1 setup]# cd apr-1.5.2
[root@web1 apr-1.5.2]# ./configure –prefix=/usr/local/apr
[root@web1 apr-1.5.2]# make && make install
[root@web1 setup]# tar xzvf apr-util-1.5.4.tar.gz
[root@web1 setup]# cd apr-util-1.5.4
[root@web1 apr-util-1.5.4]# ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
[root@web1 apr-util-1.5.4]# make && make install
[root@web1 setup]# tar zxvf httpd-2.4.16.tar.gz
[root@web1 setup]# cd httpd-2.4.16
[root@web1 httpd-2.4.16]# ./configure –prefix=/usr/local/apache –sysconfdir=/etc/httpd –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –enable-modules=most –enable-mpms-shared=all –with-mpm=event
[root@web1 httpd-2.4.16]# make && make install
[root@web1 local]# ln -sv /usr/local/apache/include/ /usr/local/include/apache
[root@web1 apache]# vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache/bin:$PATH
[root@web1 apache]# . /etc/profile.d/httpd.sh
[root@web1 apache]# vim /etc/rc.d/init.d/httpd
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: – 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon –pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL
##進行環境設置
[root@web1 apache]# chmod +x /etc/rc.d/init.d/httpd
[root@web1 apache]# chkconfig –add httpd
[root@web1 apache]# chkconfig httpd on
##啟動服務
[root@web1 apache]# service httpd start
Starting httpd: AH00557: httpd: apr_sockaddr_info_get() failed for web1.test.net
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
##檢查驗證 [ OK ]
[root@web1 apache]# ss -ntlp | grep httpd
LISTEN 0 128 :::80 :::* users:(("httpd",53093,4),("httpd",53096,4),("httpd",53097,4),("httpd",53098,4))
[root@web1 apache]# curl http://172.16.100.101
<html><body><h1>It works!</h1></body></html>
[root@web1 apache]#
3.Web2配置
##安裝httpd
[root@web2 setup]# yum install -y httpd
##構造web2網頁
[root@web2 setup]# vim /var/www/html/index.html
<h1>web2 172.16.100.102</h1>
##啟動服務
[root@web2 setup]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for web2.test.net
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
##檢查驗證 [ OK ]
[root@web2 setup]# ss -ntlp | grep httpd
LISTEN 0 128 :::80 :::* users:(("httpd",7978,4),("httpd",7981,4),("httpd",7982,4),("httpd",7983,4),("httpd",7984,4),("httpd",7985,4),("httpd",7986,4),("httpd",7987,4),("httpd",7988,4))
[root@web2 setup]# curl -I http://172.16.100.102
HTTP/1.1 200 OK
Date: Tue, 29 Nov 2016 07:50:49 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 29 Nov 2016 07:47:30 GMT
ETag: "a42f2-1e-5426bcce6f002"
Accept-Ranges: bytes
Content-Length: 30
Connection: close
Content-Type: text/html; charset=UTF-8
[root@web2 setup]#
##以上基礎安裝設置完畢,下面開始設置訪問網頁的動靜分離
##首先設置172.16.100.101上的httpd反向代理tomcat服務
##配置反向代理
httpd.conf
ServerName web1.test.net
##DocumentRoot "/usr/local/apache/htdocs"
# Virtual hosts
Include /etc/httpd/extra/httpd-vhosts.conf
##虛擬主機設置,所有請求反代到tomcat8080
[root@web1 extra]# vim httpd-vhosts.conf
<VirtualHost *:80>
ServerName web1.test.net
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://172.16.100.101:8080/
ProxyPassReverse / http://172.16.100.101:8080/
<Location />
Require all granted
</Location>
</VirtualHost>
##配置webprox1上的nginx,將動態網頁(這里是jsp,同理,還可以是php)的請求轉發至web1(172.16.100.101),將靜態網頁的請求轉發至web2(172.16.100.102)
location ~* \.jsp$ {
proxy_pass http://172.16.100.101;
}
location / {
proxy_pass http://172.16.100.102;
}
至于jsp連接mysql數據庫,則只需在tomcat的機器上安裝上專門連接mysql的驅動,然后在jsp代碼中創建連接即可,我這里就偷懶不做了,或者留到下次再一并實現。
##測試
##請注意看效果,第一張圖訪問的url是webprox1的IP地址,且是動態jsp網頁,獲得的網頁內容則是后端web1 tomcat8080的。而第二張圖片訪問的url IP地址不變,同樣是webproxy1,但網頁是靜態的html,獲取到的網頁內容也相應的變成了web2上httpd的網頁內容。因而,網站的動靜態網頁實現了分流。
本次實驗只是簡單的實現了LNAMT的反向代理及動靜分離,并未涉及高可用和負載均衡。下次會將這兩個元素添加進去,使整個環境與生產環境更為接近。敬請期待!
以上為我實現的LNAMT環境,我對linux的認識還是很膚淺,以上可能有不正確的地方,如有錯漏,希望各位能指正,共同進步。
我的QQ:153975050
在此感謝馬哥及馬哥團隊的所有人,在linux的道路上引領我一直前進!
2016-12-1 凌晨
原創文章,作者:馬哥Net19_小斌斌,如若轉載,請注明出處:http://www.www58058.com/61757