龙空技术网

# 高可用的并发解决方案nginx+keepalived(二)

段子手168 45

前言:

当前各位老铁们对“nginx一个域名转发多个端口”大约比较讲究,我们都需要分析一些“nginx一个域名转发多个端口”的相关资讯。那么小编也在网摘上搜集了一些有关“nginx一个域名转发多个端口””的相关文章,希望咱们能喜欢,各位老铁们快快来学习一下吧!

# 高可用的并发解决方案nginx+keepalived(二)

## 一、Nginx负载均衡模块

### 1、Nginx处理HTTP负载均衡模块(HTTP Upstream)

这个模块为后端的服务器提供简单的负载均衡(轮询(round-robin)和连接IP(client IP))

如下例:vim /usr/local/server/nginx/conf/nginx.conf

```bash

upstream backend {

server backend1.example.com weight=5;

server backend2.example.com:8080;

server unix:/tmp/backend3;

}

server {

location / {

proxy_pass ;

}

}

```

### 2、Nginx处理HTTP负载均衡模块(HTTP Upstream)指令:ip_hash

1)语法:ip_hash

2)默认值:none

3)使用字段:upstream

4)这个指令将基于客户端连接的IP地址来分发请求。

5)哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。

6)无法将权重(weight)与ip_hash联合使用来分发连接。如果有某台服务器不可用,你必须标记其为“down”,

7)如下例 vim /usr/local/server/nginx/conf/nginx.conf

```bash

upstream backend {

ip_hash;

server backend1.example.com;

server backend2.example.com;

server backend3.example.com down;

server backend4.example.com;

}

```

### 3、Nginx处理HTTP负载均衡模块(HTTP Upstream)指令:server

1)语法:server name [parameters]

2)默认值:none

3)使用字段:upstream

4)指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。

- weight = NUMBER - 设置服务器权重,默认为1。

- max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。

- fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。

- down - 标记服务器处于离线状态,通常和ip_hash一起使用。

- backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。

5)示例配置vim /usr/local/server/nginx/conf/nginx.conf

```bash

upstream backend {

server backend1.example.comweight=5;

server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;

server unix:/tmp/backend3;

}

```

6)注意:如果你只使用一台上游服务器,nginx将设置一个内置变量为1,即max_fails和fail_timeout参数不会被处理。

结果:如果nginx不能连接到上游,请求将丢失。

解决:使用多台上游服务器。

### 4、Nginx处理HTTP负载均衡模块(HTTP Upstream)指令:upstream

1)语法:upstream name { ... }

2)默认值:none

3)使用字段:http

4)这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。

服务器可以指定不同的权重,默认为1。

5)示例配置vim /usr/local/server/nginx/conf/nginx.conf

```bash

upstream backend {

server backend1.example.com weight=5;

server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;

server unix:/tmp/backend3;

}

```

## 二、Nginx访问控制模块HTTP访问控制模块(HTTP Access)

### 1、Nginx处理HTTP访问控制模块(HTTP Access)

1)这个模块提供简单的基于主机的访问控制。

2)ngx_http_access_module这个模块可以详细的检查客户端IP,并且按顺序执行第一条匹配的规则。

3)如下例:vim /usr/local/server/nginx/conf/nginx.conf

```bash

location / {

deny192.168.1.1;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

denyall;

}

```

4)上面的例子中仅允许192.168.1.0/24和10.1.1.0/16网络段访问,但192.168.1.1是个例外。

如果要实施很多复杂的规则,那么最好使用GeoIP module模块。

### 2、Nginx处理HTTP访问控制模块(HTTP Access)指令 allow

1)语法:allow [ address | CIDR | all ]

2)默认值:no

3)使用字段:http, server, location, limit_except

指令指定了允许访问的IP或网络段。

### 3、Nginx处理HTTP访问控制模块(HTTP Access)指令deny

1)语法:deny [ address | CIDR | all ]

2)默认值:no

3)使用字段:http, server, location, limit_except

指令指定了拒绝访问的IP或网络段。

4)提示和技巧

HttpAccess模块可以和error_page指令搭配使用来重定向一个未经验证的访问请求。

```bash

error_page 403 ;

location / {

deny192.168.1.1;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

denyall;

}

```

## 三、Nginx + tomcat实现集群

### 1、当我们网站并发量高的时候,一台tomcat无法承受大量并发,可以考虑Nginx+Tomcat集群来实现。

### 2、配置说明

准备3台tomcat,端口分别是8081、8082、8083,针对同一个域名,每次用Nginx实现不同的转发,分别在每个tomcat的webapps目录下创建ROOT目录,并创建index.html,分别在html的body里标记1/2/3以示区分。

### 3、打开 VirtualBox 虚拟机 启动 CentOS7,确认已经安装 nginx ,nginx 下载安装请点击:

### 4、部署 tomcat 集群

1)上传 tomcat 到服务器,解压即安装,复制 3 份

```bash

# 切换目录

cd /usr/local

# 创建目录

mkdir tomcat

# 切换 到 tomcat目录

cd /usr/local/tomcat

# 上传tomcat 到服务器的 /usr/local/tomcat/ 目录下。

# 解压缩 tomcat

[root@localhost tomcat]# tar -zxvf apache-tomcat-8.5.70.tar.gz

# 更名

[root@localhost tomcat]# mv apache-tomcat-8.5.70 apache-tomcat-1

# 复制3份

[root@localhost tomcat]# cp -r apache-tomcat-1 apache-tomcat-2

[root@localhost tomcat]# cp -r apache-tomcat-1 apache-tomcat-3

```

2)配置端口

tomcat-1 端口:8015 8081 8019

tomcat-2 端口:8025 8082 8029

tomcat-3 端口:8035 8083 8039

```bash

# 切换 到 tomcat目录

cd /usr/local/tomcat

# 1)更改 tomcat-1 端口

[root@localhost tomcat]# vim apache-tomcat-1/conf/server.xml

# 内容如下:

<?xml version="1.0" encoding="UTF-8"?>

.........

<Server port="8015" shutdown="SHUTDOWN">

.........

<Connector port="8081" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

.........

<Connector protocol="AJP/1.3"

address="::1"

port="8019"

redirectPort="8443" />

# ESC + :wq 保存退出

# 2)更改 tomcat-1 端口

[root@localhost tomcat]# vim apache-tomcat-1/conf/server.xml

# 内容如下:

<?xml version="1.0" encoding="UTF-8"?>

.........

<Server port="8025" shutdown="SHUTDOWN">

.........

<Connector port="8082" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

.........

<Connector protocol="AJP/1.3"

address="::1"

port="8029"

redirectPort="8443" />

# ESC + :wq 保存退出

# 3)更改 tomcat-1 端口

[root@localhost tomcat]# vim apache-tomcat-3/conf/server.xml

# 内容如下:

<?xml version="1.0" encoding="UTF-8"?>

.........

<Server port="8035" shutdown="SHUTDOWN">

.........

<Connector port="8083" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

.........

<Connector protocol="AJP/1.3"

address="::1"

port="8039"

redirectPort="8443" />

# ESC + :wq 保存退出

```

3)删除 tomcat/webapps/ 目录下的所有内容,重新创建 tomcat/webapps/ROOT/ 目录,并分别创建页面 tomcat/webapps/ROOT/index.html

```bash

# 切换 到 tomcat目录

cd /usr/local/tomcat

# 查看tomcat/webapps/ 目录下的所有内容

[root@localhost tomcat]# ll ./apache-tomcat-1/webapps/

总用量 4

drwxr-x---. 15 root root 4096 9月 20 09:22 docs

drwxr-x---. 7 root root 99 9月 20 09:22 examples

drwxr-x---. 6 root root 79 9月 20 09:22 host-manager

drwxr-x---. 6 root root 114 9月 20 09:22 manager

drwxr-x---. 3 root root 223 9月 20 09:22 ROOT

# 删除 tomcat/webapps/ 目录下的所有内容

[root@localhost tomcat]# rm -rf ./apache-tomcat-1/webapps/*

[root@localhost tomcat]# rm -rf ./apache-tomcat-2/webapps/*

[root@localhost tomcat]# rm -rf ./apache-tomcat-3/webapps/*

# 重新创建 tomcat/webapps/ROOT/ 目录

[root@localhost tomcat]# mkdir ./apache-tomcat-3/webapps/ROOT

[root@localhost tomcat]# mkdir ./apache-tomcat-2/webapps/ROOT

[root@localhost tomcat]# mkdir ./apache-tomcat-1/webapps/ROOT

#分别创建页面 tomcat/webapps/ROOT/index.html

[root@localhost tomcat]# vim ./apache-tomcat-1/webapps/ROOT/index.html

# 内容如下:

<html>

<head>tomcat-1</head>

<body>

<h1> 这是 tomcat-1 的 index.html 页面,端口:8081 </h1>

</body>

</html>

# ESC + :wq 保存退出

[root@localhost tomcat]# vim ./apache-tomcat-2/webapps/ROOT/index.html

# 内容如下:

<html>

<head>tomcat-2</head>

<body>

<h2> 这是 tomcat-2 的 index.html 页面,端口:8082 </h2>

</body>

</html>

# ESC + :wq 保存退出

[root@localhost tomcat]# vim ./apache-tomcat-3/webapps/ROOT/index.html

# 内容如下:

<html>

<head>tomcat-3</head>

<body>

<h3> 这是 tomcat-3 的 index.html 页面,端口:8083</body> </h3>

</html>

# ESC + :wq 保存退出

```

### 5、启动 tomcat 集群

```bash

# 切换 到 tomcat目录

cd /usr/local/tomcat

# 启动 tomcat

[root@localhost tomcat]# ./apache-tomcat-1/bin/startup.sh

Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-1

Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-1

Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-1/temp

Using JRE_HOME: /usr/local/jdk8/java-se-8u43-ri

Using CLASSPATH: /usr/local/tomcat/apache-tomcat-1/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-1/bin/tomcat-juli.jar

Using CATALINA_OPTS:

Tomcat started.

[root@localhost tomcat]# ./apache-tomcat-2/bin/startup.sh

Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-2

Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-2

Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-2/temp

Using JRE_HOME: /usr/local/jdk8/java-se-8u43-ri

Using CLASSPATH: /usr/local/tomcat/apache-tomcat-2/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-2/bin/tomcat-juli.jar

Using CATALINA_OPTS:

Tomcat started.

[root@localhost tomcat]# ./apache-tomcat-3/bin/startup.sh

Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-3

Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-3

Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-3/temp

Using JRE_HOME: /usr/local/jdk8/java-se-8u43-ri

Using CLASSPATH: /usr/local/tomcat/apache-tomcat-3/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-3/bin/tomcat-juli.jar

Using CATALINA_OPTS:

Tomcat started.

# 确认防火墙已经放行 8081 8082 8083 端口。

[root@localhost tomcat]# vim /etc/sysconfig/iptables

# 防火墙内容如下:

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8082 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8083 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

# ESC + :wq 保存退出

# 重启防火墙

service iptables restart

# 或者(使用的是 firewall)让防火墙放行端口:8081 8082 8083

firewall-cmd --zone=public --add-port=8081/tcp --permanent

firewall-cmd --zone=public --add-port=8082/tcp --permanent

firewall-cmd --zone=public --add-port=8083/tcp --permanent

# 设置完,重新载入防火墙(使用的是 firewall)

firewall-cmd --reload

```

### 6、访问测试 tomcat,浏览器地址栏输入(其中:192.168.43.216 为你的虚拟机 IP 地址):

### 7、nginx 集群配置

1)打开 nginx 配置文件

```bash

# 切换目录

[root@localhost nginx]# cd /usr/local/nginx

# 打开 nginx 配置文件

vim /usr/local/nginx/nginx/conf/nginx.conf

# 配置内容如下:

#user nobody;

worker_processes 1;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

# Nginx处理HTTP负载均衡

upstream clustertomcat {

server 192.168.43.216:8081 weight=2;

server 192.168.43.216:8082 weight=1;

server 192.168.43.216:8083 weight=1;

}

server {

# nginx 默认监听端口80

listen 80;

server_name localhost;

location / {

# 代理路径

proxy_pass ;

}

}

server {

listen 80;

server_name localhost;

location / {

root html;

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

# ESC + :wq 保存退出

# 切换目录

cd /usr/local/nginx/

# 重新载入 nginx

[root@localhost nginx]# ./nginx/sbin/nginx -s reload

# 或者先停止 nginx 再重新启动 nginx

[root@localhost nginx]# ./nginx/sbin/nginx -s quit

[root@localhost nginx]# ./nginx/sbin/nginx -c /usr/local/nginx/nginx/conf/nginx.conf

```

2)访问测试 nginx 负载均衡,浏览器地址栏输入(其中:192.168.43.216 为你的虚拟机 IP 地址):多刷新几次,观察访问的页面。

上一节关联链接请点击:

标签: #nginx一个域名转发多个端口