Nginx反向代理后端多个Tomcat、Nginx+PHP服务器(Nginx的代理和负载功能)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

    现有3个二级域名,一个IP地址,要实现将这3个域名通过1个IP地址对外提供web服务,可使用IP+端口的方式对域名进行解析,且互不影响。如:

Domain1:www.huangming.org     IPADDR:192.168.1.33:80

Domain2:web1.huangming.org    IPADDR:192.168.1.33:8080

Domain3:web2.huangming.org    IPADDR:192.168.1.33:8080

    其中Domain1作为Nginx反向代理的2台后端Read Server(Nginx+PHP),并实现负载均衡的功能。Domain2、3为通过Nginx反向代理的2台后端Tomcat Server。


实验拓扑:

wKiom1cKEvXyQa3AAAGBCSFd6M8987.jpg


环境介绍:      

Hostname IPADDR Server
host1 192.168.1.231 Nginx PHP Tomcat MySQL
host2 192.168.1.232 Nginx PHP Tomcat MySQL
hxm(huangming.org) 192.168.1.33 Nginx-Proxy


Step1:在host1、2上搭建配置Tomcat虚拟主机,下面是相关配置

[root@host1 ~]# vim /usr/local/tomcat/conf/server.xml

1、打开server.xml配置文件,修改defaultHost="web1.huangming.org",并设置Hostname

2、指定webapp的目录存放路径appBase="/data/webapp1"

3、设置日志存放路径directory="/data/webapp1/logs"

[root@host1 ~]# vim /usr/local/tomcat/conf/server.xml    ;在文件最后增加一个Host

1
2
3
4
5
6
7
8
     <Engine name= "Catalina"  defaultHost= "web1.huangming.org" >   
         <Host name= "web1.huangming.org"  appBase= "/data/webapp1"  unpackWARS= "true"  autoDeploy= "true" >
             <Context path= ""  docBase= "/data/webapp1"  reloadabled= "true"  />
             <Valve className= "org.apache.catalina.valves.AccessLogValve"  directory= "/data/webapp1/logs"
                 prefix= "web1_access_log."  suffix= ".txt"
                 pattern= "%h %l %u %t &quot;%r&quot; %s %b"  />
         < /Host >
     < /Engine >


4、创建webapp的目录文件

[root@host1 ~]# mkdir /data/webapp1

[root@host1 ~]# mkdir /data/webapp1/{lib,classes,WEB-INF,META-INF,logs} -p

1
2
[root@host1 ~] # ls /data/webapp1/
classes  index.jsp  lib  logs  META-INF  WEB-INF

5、创建一个index.jsp页面

1
2
3
4
5
6
7
8
9
10
<%@ page language= "java"  %>
<%@ page  import = "java.util.*"  %>
<html>
     < head >
         <title>web1.huangming.org  test  page.< /title >
     < /head >
     <body>
         <% out.println( "Hello,This is web1." ); %>
     < /body >
< /html >


6、在host2创建配置Tomcat虚拟主机,与host1相同

1
2
3
4
5
6
7
8
     <Engine name= "Catalina"  defaultHost= "web2.huangming.org" >
         <Host name= "web2.huangming.org"  appBase= "/data/webapp2"  unpackWARS= "true"  autoDeploy= "true" >
             <Context path= ""  docBase= "/data/webapp2"  reloadabled= "true"  />
             <Valve className= "org.apache.catalina.valves.AccessLogValve"  directory= "/data/webapp2/logs"
                 prefix= "web2_access_log."  suffix= ".txt"
                 pattern= "%h %l %u %t &quot;%r&quot; %s %b"  />
         < /Host >
     < /Engine >


Step2:Host1和Host2的Nginx虚拟主机搭建和配置

1、Host1配置一个WEB虚拟主机,添加一个server.conf配置文件

[root@host1 ~]# vim /etc/nginx/vhosts/www.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
     listen      80;
     server_name 192.168.1.231;
     index index.html index.htm index.php index.jsp;
     server_tokens       off;
     root         /data/www/html ;
     access_log   /var/log/nginx/www_access .log main;
 
     location / {
         root     /data/www/html ;
         index   index.html inex.htm index.php;
     }
 
     location ~ \.php$ {
         include fastcgi_params;
         fastcgi_pass unix: /var/lib/php/php-fcgi .sock;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME  /data/www/html $fastcgi_script_name;
     }


2、Host2配置一个WEB虚拟主机,添加一个server.conf配置文件

[root@host2 ~]# vim /etc/nginx/vhosts/www.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
     listen      80;
     server_name 192.168.1.232;
     index index.html index.htm index.php index.jsp;
     server_tokens       off;
     root         /data/www/html ;
     access_log   /var/log/nginx/www_access .log main;
 
     location / {
         root     /data/www/html ;
         index   index.html inex.htm index.php;
     }
 
     location ~ \.php$ {
         include fastcgi_params;
         fastcgi_pass unix: /var/lib/php/php-fcgi .sock;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME  /data/www/html $fastcgi_script_name;
     }


3、php-fpm的配置

# vim /usr/local/php/etc/php-fpm.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[global]
pid =  /usr/local/php/var/run/php-fpm .pid
error_log =  /usr/local/php/var/log/php-fpm .log
[www]
listen =  /var/lib/php/php-fcgi .sock
user = php-fpm
group = php-fpm
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
 
slowlog =  /var/log/php/www_slow .log
request_slowlog_timeout = 1
php_admin_value[open_basedir]= /data/www/ : /tmp/


Step3:Nginx反向代理服务器配置


在nginx配置文件的http模块中添加server配置

http {

    include vhosts/*.conf;

......


upstream bbs {  ;负载均衡配置

    ip_hash;
    server 192.168.1.231:80 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.232:80 weight=1 max_fails=3 fail_timeout=30s;
    }

server {    ;此server代理Domain1:www.haungming.org

    listen      80;

    server_name www.huangming.org huangming.org 192.168.1.33;

    index index.html index.htm index.php index.jsp;

    server_tokens       off;

    access_log  /var/log/nginx/www.access.log main;


    location / {

        proxy_pass http://bbs;

        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_next_upstream http_500 http_502 http_503 error timeout invalid_header;

        proxy_buffering on;

        proxy_redirect off;

        proxy_connect_timeout 300s;

        proxy_send_timeout 300s;

        proxy_read_timeout 300s;

        proxy_buffer_size 64k;

        proxy_buffers 4 64k;

        proxy_busy_buffers_size 64k;

        proxy_temp_file_write_size 64k;

        proxy_max_temp_file_size 1024m;

    }

}


server {    ;此server代理Domian2:web1.huangming.org

    listen      80;

    server_name web1.huangming.org;

    index index.html index.htm index.jsp;

    server_tokens       off;

    access_log  /var/log/nginx/web1.access.log main;


    location / {

        proxy_pass http://192.168.1.231:8080;

        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_next_upstream http_500 http_502 http_503 error timeout invalid_header;

    }

}


server {    ;此server代理Domain3:web2.huangming.org

    listen      80;

    server_name web2.huangming.org;

    index index.html index.htm index.jsp;

    server_tokens       off;

    access_log  /var/log/nginx/web2.access.log main;


    location / {

        proxy_pass http://192.168.1.232:8080;

        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_next_upstream http_500 http_502 http_503 error timeout invalid_header;

    }

}


}


Step4:后端Nginx read server的日志记录

如果在web前端使用了代理,Nginx会使用默认的日志记录格式,记录不到客户的真实IP地址,故将两台host1、2的Nginx日志格式记录如下:

http {

......

    log_format  main  '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" "$request_time"'

                      '"$http_user_agent" $HTTP_X_Forwarded_For';

测试效果

1
[root@node1 ~] # curl http://192.168.1.33 -I

wKiom1cKRa3AZIUXAAB4pWVpcQY979.jpg


Step5:Nginx代理服务的日志记录

http {
......
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$gzip_ratio" "$http_referer"'
                      '"$http_user_agent" "$http_x_forwarded_for" [$upstream_addr] '
                      '"$upstream_response_time" - "$request_time"';
}

测试效果:

其中"$upstream_addr"为响应客户请求的后端read server的IP address

wKiom1cKRnrgRtRFAACDs1LcdPI040.jpg


Step6:Nginx的静态缓存、防盗链的相关配置,在host1、2上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
......
     location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {
          expires        7d;
          root    /data/www/html ;
          access_log     off;
         valid_referers none blocked *.huangming.org huangming.org;
         if  ($invalid_referer)
             {
                 return  403;
             }
      }
 
     location ~ .*\.(js|css)?$ {
         expires         24h;
         access_log      off;
     }
 
     location ~ (static|cache) {
         access_log      off;
     }
}


Step7:测试Nginx反向代理和负载均衡

首先需要将域名做好解析,可以在本机hosts文件设置,或者在万网解析

1、测试Domian1

wKiom1cKSknAuUZ1AADMfAIHksM284.jpg

查看日志记录是否负载成功

wKiom1cKSpSTPAMjAACoQIJMczQ416.jpg


2、测试访问Domain2、3(Tomcat服务器)

wKiom1cKS5TjbdIAAABSWYVRhOI405.jpg


查看Nginx代理Tomcat的访问日志

1
2
3
[root@hxm ~] # tail -2 /var/log/nginx/web1.access.log 
101.233.172.217 - - [07 /Apr/2016 :11:51:02 +0800]  "GET / HTTP/1.1"  200 145  "-"  "-" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"  "-"  [192.168.1.231:8080]  "0.007"  "0.007"
101.233.172.217 - - [07 /Apr/2016 :11:51:44 +0800]  "GET / HTTP/1.1"  200 145  "-"  "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"  "-"  [192.168.1.231:8080]  "0.005"  "0.005"


1
2
3
[root@hxm ~] # tail -2 /var/log/nginx/web2.access.log 
101.233.172.217 - - [07 /Apr/2016 :11:50:30 +0800]  "GET /favicon.ico HTTP/1.1"  404 1016  "-"  "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"  "-"  [192.168.1.232:8080]  "0.018"  "0.018"
101.233.172.217 - - [07 /Apr/2016 :11:51:56 +0800]  "GET / HTTP/1.1"  200 145  "-"  "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"  "-"  [192.168.1.232:8080]  "0.011"  "0.011"


Step8:关于Tomcat的默认管理主页

将name=localhost,修改为本机地址192.168.1.231,这样可以在本地通过访问这个IP进入Tomcat的默认主页和配置管理页面(这样与web1.huangming.org不产生冲突

[root@host1 ~]# vim /usr/local/tomcat/conf/server.xml 

wKiom1cKTbXh6jYUAAATnVnbxx4354.jpg


wKiom1cKTqjBikXYAACuhOB4woI235.jpg


Step9:Domain1:www.huangming.org站点目录的同步

这里在Host1和Host2之间使用NFS文件服务器,Host2挂载Host1的站点目录文件

[root@host2 conf]# df -Th
Filesystem           Type   Size  Used Avail Use% Mounted on
/dev/sda3            ext4    13G  5.8G  6.1G  49% /
tmpfs                tmpfs  491M     0  491M   0% /dev/shm
/dev/sda1            ext4   190M   27M  154M  15% /boot
192.168.1.231:/data/www/html
                     nfs     13G  3.4G  8.6G  29% /data/www/html




结语:Nginx服务器的缓存配置

在web的前端,通常会加一层缓存服务器,作为缓存后端Read Server的网页内容,以加快访问速度,因此可以使用前端的Nginx代理服务器配置文件中添加缓存配置同时作为缓存服务使用



本文转自 HMLinux 51CTO博客,原文链接:http://blog.51cto.com/7424593/1762432

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
JavaScript PHP UED
16 PHP实现图书删除功能
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入了解PHP。本文介绍了如何实现图书删除功能,通过点击删除按钮触发`deleteBook.php`文件,完成删除操作并返回列表页。同时,还新增了一个“新增”按钮,优化了用户体验。
17 2
16 PHP实现图书删除功能
|
7天前
|
JavaScript PHP
17 PHP 实现批量删除功能
路老师在本文中继续优化图书删除功能,实现批量删除图书。通过添加删除按钮、表格前的复选框以及实现PHP后端逻辑,展示了完整的删除流程和效果。
23 8
|
9天前
|
自然语言处理 编译器 应用服务中间件
PHP在服务器上的运行过程
PHP在服务器上的运行过程
28 7
|
7天前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
23 3
|
7天前
|
数据库连接 PHP
15 PHP实现图书修改功能
路老师分享了如何使用PHP实现图书信息的修改功能。首先,在列表页面点击编辑按钮,跳转至`editBook.php`,通过ID获取图书信息并展示在`edit.html`页面。用户提交修改后,`updateBook.php`处理更新请求,成功后返回到图书列表页。纯干货,技术知识满满。
18 2
|
7天前
|
PHP
14 PHP实现图书添加功能
路老师分享PHP语言知识,帮助大家入门并深入了解PHP。本文介绍如何实现图书添加功能,包括创建HTML表单和PHP后端处理逻辑,最后展示实际效果。
15 2
|
21天前
|
PHP 开发者
PHP作为一门流行的服务器端脚本语言,深入理解PHP的命名空间
【10月更文挑战第22天】PHP作为一门流行的服务器端脚本语言,自1995年诞生以来,已经发展了二十多年。在这二十多年的时间里,PHP经历了多次重大版本的更新,不断增加新特性和改进。其中,命名空间(Namespace)是PHP 5.3.0引入的一个重要特性,它为PHP的代码组织和重用提供了一种新的方式。本文将从三个部分深入理解PHP的命名空间:一是命名空间的基本概念和作用;二是PHP命名空间的使用方法;三是通过实例讲解命名空间的应用。
25 4
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
44 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。