Nginx

Nginx 是一款高性能的Web服务器软件.

具有极高的并发性能

利用Nginx与Tomcat组合使用, 搭建反向代理集群

Nginx 反向代理集群可以解决网站的高并发问题!

常见Web Server

开源软件:

  • Nginx
  • Apache
  • Apache Tomcat (Java EE)
  • Jetty (Java EE)

商业软件

  • Microsoft IIS
  • IBM Webspare (Java EE)
  • Oracle Weblogic (Java EE)

Java EE WEB 服务器也称为 Java WEB 容器.

使用Nginx

1.源码编译安装

参考文档: http://nginx.org/en/docs/configure.html

安装步骤:

  1. 下载源代码wget http://nginx.org/download/nginx-1.12.2.tar.gz
  2. 创建nginx用户useradd nginx
  3. 创建 nginx 的安装目标目录mkdir /usr/local/nginx
  4. 安装编译时候需要的依赖包(可选)yum -y install pcre-devel openssl openssl-devel
  5. 释放并且编译tar -zxf nginx-1.12.2.tar.gz cd nginx-1.12.2 ./configure --prefix=/usr/local/nginx --user=nginx –with-http_ssl_module make make install

6.启动: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 关闭: /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

7.检查进程

ps -A|grep nginx

测试, 用浏览器访问

http:/192.168.17.70

Nginx 的配置文件结构

Nginx的功能是通过配置文件实现的, 使用Nginx就是会使用Nginx的配置文件.

nginx配置文件位置:

  1. 编译安装版本
  • /usr/local/nginx/conf/nginx.conf
  1. yum安装版本
  • /etc/nginx/nginx.conf

Nginx配置文件结构

通用(全局)配置参数

http{
	http 协议通用参数

	server{
		虚拟机配置参数
	}

	server{
		虚拟机配置参数
	}

}

全局通用参数

  1. worker_processes

建议按照处理器数量进行设置, 4处理器设置为4

worker_processes  1;
  1. 每个进程的线程数量, 就是进程中线程池的大小.
events {
     worker_connections  1024;
 }
  1. pid 文件用于存储 Nginx 主进程号
  2. 日志文件, 如果打开可以记录日志,但同时服务器的性能也会下降

http通用参数

  1. ContentType 类型映射, 也就是多媒体文件类型映射.
include       mime.types;
 default_type  application/octet-stream;

使用include指令简化主配置文件.

  1. keepalive 指定HTTP/1.1 协议时候的服务器端的长连接等待超时时间
keepalive_timeout  65;
  1. 对服务器的响应进行gzip压缩传输, 可以节省网络流量. 但是问题有两个, 一个是老旧浏览器(IE6)不支持, 第二个会占用服务器的处理器.
gzip  on;

更新 Nginx配置文件实验

cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.2018.5.3
vim nginx.conf   //开放 http 访问日志, 开放gzip压缩
//测试配置文件
nginx -t -c /usr/local/nginx/conf/nginx.conf
//热加载配置文件: 不停止nginx服务的情况下加载配置文件
nginx -s reload

用浏览器进行测试 查看 nginx/logs/access.log 日志文件

2.虚拟主机(个人理解:正向代理,分配私有ip)

在一个Web服务器上通过服务器软件模拟多台Web 服务器, 其中每个虚拟的Web服务器称为一个虚拟主机. 虚拟主机的好处是可以充分复用同一个web服务器. 对于用户来说, 用户感觉是多个网站.

Nginx 配置文件中 每个 server{} 块对应一个虚拟主机

虚拟主机有3种:

  1. 基于域名的虚拟主机(最常用的虚拟主机)
  • 需要为服务器指定多个域名
  • 域名资源解析方便, 便于用户记忆, 用户体验好.
  1. 基于IP虚拟主机
  • 需要为服务器指定多个IP地址
  • 需要租用IP
  • 很少使用这种方式
  1. 基于端口的虚拟主机
  • 绑定到服务器的多个端口
  • 默认80端口只有一个
  • 使用其他端口号提供服务, 因为用户需要记忆端口, 用户的体验差

2.1配置虚拟主机具体步骤:

1.本地解析域名实验

cd /etc
cp hosts hosts.2018.5.3
ping t1.canglaoshi.org  //不通
vim hosts    添加  10.7.11.19  t1.canglaoshi.org
			 添加  10.7.11.19  t2.canglaoshi.org

测试是否可以建立连接: ping t1.canglaoshi.org //通了 结束命令 Ctrl + C ping t2.canglaoshi.org //通了

windows 实验

用记事本编辑: C:\Windows\System32\drivers\etc\hosts
notepad hosts
添加  10.7.11.19  t1.canglaoshi.org
添加  10.7.11.19  t2.canglaoshi.org

测试是否可以建立连接:
ping t1.canglaoshi.org 通了 
ping t2.canglaoshi.org 通了

2.搭建Nginx基于域名的虚拟主机

2.1在Nginx文件下对 nginx.conf文件进行编辑:

在原有的server上面进行添加t1和t2内容: server { listen 80; server_name localhost;

# 请求 t1.canglaoshi.org 访问 t1文件夹 index.html文件
server{
    listen  80;
    server_name  t1.canglaoshi.org;
    location / {
        root  t1;
        index index.html;
    }
}
# 请求 t2.canglaoshi.org 访问 t2文件夹 index.html文件
server{
    listen  80;
    server_name  t2.canglaoshi.org;
    location / {
        root t2;
        index index.html;
    }
}

2.2在Nginx文件夹/usr/local/nginx中添加t1和t2文件夹,并添加两个index.html文件

<html>
	<body>	
		<h1>Hello t1.canglaosho.org</h1>
	</body>
</html>

2.3测试: 平滑重启:/usr/local/nginx/sbin/nginx -s reload

最后测试: http://t1.canglaoshi.org 对应域名 http://t2.canglaoshi.org

3.Nginx反向代理集群

个人理解:正向代理指的是多个客户端通过分配的私网ip访问一个代理服务器,这个代理服务器拥有一个公网ip,然后去访问互联网或者某个被墙的网站。反向代理一般是用作服务器集群,用户通过一个公网ip在浏览器上进行访问,然后请求会发到具体的Nginx服务器上,然后这个Nginx服务器只负责处理请求,并不处理数据,所以会将一个个的请求转发到具体的私网Tomcat服务器上进行处理,最后返回响应。

下图为正向与反向代理图:

hiveserver2 nginx负载均衡 nginx负载均衡ip_服务器

下图为:Nginx集群部署图

hiveserver2 nginx负载均衡 nginx负载均衡ip_服务器_02

反向代理集群的优势是提高网站整体的并发处理能力.

3.1配置使用反向代理

配置步骤

  1. 进行合理的规划: 规定每个服务器所扮演的角色.
  2. 本地客户端添加新的域名解析
  3. 配置每个Tomcat应用服务器, 并且启动测试. 装好JDK和Tomcat后,在apache-tomcat-7.0.96/webapps/ROOT/index.jsp文件中, 在

后面加上ip后缀,进行标记。

  1. 配置Nginx服务器, 对nginx文件夹中的Nginx.conf文件进行编辑, 4.1.在 #gzip on;之下,加上文件的引入: include tts.conf; 4.2.然后在添加一个tts.conf文件和内容,
  2. 配置好之后 关闭 : /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf 开启: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 平滑启动:/usr/local/nginx/sbin/nginx -s reload
  3. 客户端浏览器访问域名, 可以看到多台Tomcat为一个域名服务

参考的 demo.conf

upstream toms{
    server 10.7.11.218:8080;
    server 10.7.11.244:8080;
    server 10.7.11.43:8080;
 }

server{
    listen 80;
    server_name nick.org;
    location / {
        proxy_pass http://toms;
        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }

 }

Nginx 集群的负载均衡策略

一共有四种

  1. 默认是轮训策略
  • 可以增加权重 weight:因为服务器(Tomcat)购买的时间点不同,性能会有所不不同,所以利用权重,也就是weight10、weight20、weight20,权重越大,获得的轮训机会和请求更多。笑的请求少一些,让服务器的有硬件能源充分应用。 -增加权重的具体操作则是在nginx的conf中配置tts.conf文件进行权重配置;
  1. ip_hash ip散列,根据用户的IP地址映射到固定的服务器
  2. url_hash 根据URL映射到固定的服务器:

个人添加服务器临时下线问题:

因为我们的软件会经常的升级,然后他升级的话,会将服务器依次下线升级之后,再放上去。
因为一般服务器会有多台在同时运行,所以不用担心,一台服务器down掉会有什么影响,
就这样依次的将服务器下线升级就可以达到整个服务器升级的手段。

具体操作:还是tts.config文件中在具体服务器后面加一个down,升级完成之后,再将down删除, 就可以重新上线啦, 具体代码例子: server 10.7.11.19:8080 weight=10; server 10.7.11.19:8080 weight=10 down ;

修改好后,重启nginx:nginx的具体路径 -t
			例如一般是:/usr/local/nginx/sbin/nginx -t	
						/usr/local/nginx/sbin/nginx -s reload

阿里云配置Nginx转发到Tomcat

这里就可以将80和443端口的请求转发到Tomcat的8080端口了.

  1. 配置Nginx
  • yum安装的nginx配置文件在 /etc/nginx/nginx.conf
  • yum安装的nginx会自动包含 /etc/nginx/conf.d/*.conf, 所以将配置文件放到这个文件夹中就可以自动包含了.
  • 添加配置文件 1711.conf:
upstream tomcat{
      server 127.0.0.1:8080;
  }
  
  server {
      listen 80;
      server_name 1711.canglaoshi.org;
      
      index index.html index.jsp;
  
      location / {
          proxy_pass http://tomcat;
          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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
          proxy_max_temp_file_size 0;
          proxy_connect_timeout      90;
          proxy_send_timeout         90;
          proxy_read_timeout         90;
          proxy_buffer_size          4k;
          proxy_buffers              4 32k;
          proxy_busy_buffers_size    64k;
          proxy_temp_file_write_size 64k;
          
      }
  }
  
  server{
      listen 80;
      server_name tom.canglaoshi.org;
      return 301 https://tom.canglaoshi.org;
  }
  
  server{
      listen 443;
      server_name tom.canglaoshi.org;
  
      ssl on;
      index index.html index.jsp;
      ssl_certificate   cert/214462831460580.pem;
      ssl_certificate_key  cert/214462831460580.key;
      ssl_session_timeout 5m;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
  
  
      location / {
          proxy_pass http://tomcat;
          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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
          proxy_max_temp_file_size 0;
          proxy_connect_timeout      90;
          proxy_send_timeout         90;
          proxy_read_timeout         90;
          proxy_buffer_size          4k;
          proxy_buffers              4 32k;
          proxy_busy_buffers_size    64k;
          proxy_temp_file_write_size 64k;
      }
  }

配置了2个域名 其中 tom.canglaoshi.org 绑定了ssl证书

  1. 测试 重新启动nginx
  2. 在阿里云的dns解析中解析 两个域名tom.canglaoshi.org, 1711.canglaoshi.org 到服务器ip
  3. 测试: 用浏览器访问这两个域名.