什么是Nginx
Nginx同Apache一样都是一种WEB服务器。基于REST(Resource Representational State Transfer 资源表现层状态转移)架构风格,以统一资源描述符(Uniform Resources Identifier)URI或统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特点等局限并且各自的定位和发展都不尽相同。这也使得各个WEB服务器有着各自鲜明的特点。
Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。
这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。
俄罗斯的工程师Igor Sysoev,他在为Rambler Media工作期间,使用C语言开发了Nginx。Nginx作为WEB服务器一直为Rambler Media提供出色而又稳定的服务。
然后呢,Igor Sysoev将Nginx代码开源,并且赋予自由软件许可证。
由于:
- Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
- 高度的模块化和自由软件许可证是的第三方模块层出不穷(这是个开源的时代啊~)
- Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上
- 这些优秀的设计带来的极大的稳定性
Nginx 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
反向代理
说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理。
正向代理
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
总结来说:正向代理,"它代理的是客户端",是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的用途:
- 访问原来无法访问的资源,如Google.
- 可以做缓存,加速访问资源.
- 对客户端访问授权,上网进行认证.
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息.
反向代理
明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,并且通过封装Nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问 Tengine 的官网查看具体的信息。 那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图(我把服务器和反向代理框在一块,同属于一个环境,后面我有介绍):
通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
反向代理的作用:
- 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载
项目场景
通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:
负载均衡
我们已经明确了所谓代理服务器的概念,那么接下来,Nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?
这里提到的客户端发送的、Nginx反向代理服务器接收到的请求数量,就是我们说的负载量。
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。
所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx支持的负载均衡调度算法方式如下:
- weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
- ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
- fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
- url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。
动态分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。
Nginx 安装
系统平台:CentOS Linux release 8.3.2011
一、安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
二、首先要安装PCRE
PCRE作用是让Nginx支持Rewrite功能。
- 下载PCRE安装包,下载地址:downloads.sourceforge.net/project/pcr…
[root@localhost home]# cd /usr/local/src/
### 下载PCRE 安装包到当前目录下
[root@localhost src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
### 安装包已经下载成功
[root@localhost src]# dir
pcre-8.37.tar.gz
- 解压安装包
[root@localhost src]# tar zxvf pcre-8.37.tar.gz
### 解压安装包成功
[root@localhost src]# dir
pcre-8.37 pcre-8.37.tar.gz
tar:可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。zxvf:是tar后面的参数。z表示通过gzip支持的压缩或解压缩。x表示解压缩。v表示在压缩或解压缩过程中显示正在处理的文件名。f表示f后面必须跟上要处理的文件名。
- 进入安装包目录
[root@localhost src]# cd pcre-8.37
- 编译安装
[root@localhost pcre-8.37]# ./configure
[root@localhost pcre-8.37]# make && make install
./configure:configure文件是一个可执行的脚本文件,它有很多选项,在待安装的源码目录下使用命令./configure –help可以输出详细的选项列表。其中--prefix选项是配置安装目录,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱。如果配置了--prefix,如:./configure --prefix=/usr/local/test安装后的所有资源文件都会被放在/usr/local/test目录中,不会分散到其他目录。make && make install:make与make install是两个命令,在你./configure生成了Makefile之后执行编译安装; 与&&一起的还有||,不过意思不一样,&&是与,||是或;make && make install的意思就是执行make(编译)如果没有发生错误就执行make install(安装)。
- 查看PCRE版本
[root@localhost pcre-8.37]# pcre-config --version
8.37
三、安装Nginx
- 下载Nginx,下载地址:nginx.org/download/ng…
[root@localhost pcre-8.37]# cd /usr/local/src/
### 通过URL下载Nginx安装包
[root@localhost src]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
### 下载成功
[root@localhost src]# dir
nginx-1.12.2.tar.gz pcre-8.37 pcre-8.37.tar.gz
- 解压安装包
[root@localhost src]# tar zxvf nginx-1.12.2.tar.gz
- 进入安装包目录
[root@localhost src]# cd nginx-1.12.2
- 编译安装
### 检查
[root@localhost nginx-1.12.2]# ./configure
[root@localhost nginx-1.12.2]# make && make install
我在安装的过程中出现了如下图所示的问题,可能是因为我的centos版本是8导致的,如果版本为centos7、6的童鞋可能不会出现下面的问题,没有出现下面问题的童鞋可以跳过。
在命令框中输入下面的指令用来编辑出现问题的文件
[root@localhost nginx-1.12.2]# vim src/os/unix/ngx_user.c
执行上面命令会出现以下页面,按i进入编辑模式,找到第36注释掉。
然后按
esc键,退出编辑模式,按住shift+:输入wq退出并保存。
然后还要输入一下命令
### 进入objs目录
[root@localhost nginx-1.12.2]# cd objs/
### 编辑Makefile文件
[root@localhost objs]# vim Makefile
执行上面命令,将会出现下图中的页面,按照下图上面的操作,然后退出保存
重新输入make && make install命令,进行编译安装就可以了。
四、启动Nginx并访问
1、进入到Nginx安装目录下的sbin文件夹中
[root@localhost /]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ls
nginx
2、启动nginx
[root@localhost sbin]# ./nginx
3、查看nginx进程,下面已经显示nginx的进程了,说明nginx已经启动了。
[root@localhost sbin]# ps -ef |grep nginx
root 1165119 1 0 08:46 ? 00:00:00 nginx: master process ./nginx
nobody 1165120 1165119 0 08:46 ? 00:00:00 nginx: worker process
root 1165122 1164705 0 08:46 pts/1 00:00:00 grep --color=auto nginx
4、查看nginx的配置文件nginx.conf
[root@localhost nginx]# vi /usr/local/nginx/conf/nginx.conf
以下是nginx的默认端口号
5、在浏览器上访问nginx
同一局域网下远程访问
如果你的Linux防火墙是开着的,并且没有对80端口进行放行,那么在同一局域网下,别的设备是无法远程访问到你的Nginx服务器的,你还需要对80端口进行放行。如果你的防火墙是关闭的或者已经对80端口放行了,下面就可以跳过了。
在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理,而不是 iptables 。
使用firwall服务添加80端口开放
- 我们可以先查看防火墙中已经开放的端口号:
[root@localhost sysconfig]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s20f0u5
sources:
services: cockpit dhcpv6-client ssh
ports: 3306/tcp 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 设置开放的端口80
[root@localhost sysconfig]# sudo firewall-cmd --add-port=80/tcp --permanent
success
- 重启防火墙
[root@localhost sysconfig]# firewall-cmd --reload
success
然后既可以访问了!
使用传统的iptables服务添加80端口开放
- 先执行以下命令,安装并开启iptables服务
### 安装
[root@localhost sysconfig]# yum install iptables-services
### 屏蔽该服务
[root@localhost sysconfig]# systemctl mask firewalld
### 启用iptables
[root@localhost sysconfig]# systemctl enable iptables
### 如果需要使用 ip6tables , 需另外加一行
[root@localhost sysconfig]# systemctl enable ip6tables
### 停止firewalld服务
[root@localhost sysconfig]# systemctl stop firewalld
### 开启 iptables服务
[root@localhost sysconfig]# systemctl restart iptables.service
到此就可以像以前使用iptables了,但看完这个流程,有的同学可能不理解systemctl是干啥的,下面简要说一下:
systemctl相当于之前service和chkconfig的融合体。可以使用它永久性启用/禁止或临时关闭/启动某个服务。
- 编辑防火墙的配置文件
[root@localhost nginx]# vi /etc/sysconfig/iptables
- 再打开的文件中加入下面一行命令,使得80端口被放行
#使防火墙放行80端口
- A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
- 然后保存配置,重启防火墙
[root@localhost sysconfig]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
### 重启防火墙
[root@localhost nginx]# service iptables restart
这一种方式也是可以的!
Nginx 操作的常用命令
使用Nginx操作命令的前提条件:必须进入nginx的目录/usr/local/nginx/sbin/
[root@localhost /]# cd /usr/local/nginx/sbin/
- 查看Nginx的版本号
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.12.2
- 启动Nginx
[root@localhost sbin]# ./nginx
### 查看进程
[root@localhost sbin]# ps -ef | grep nginx
root 1172626 1 0 10:58 ? 00:00:00 nginx: master process ./nginx
nobody 1172627 1172626 0 10:58 ? 00:00:00 nginx: worker process
root 1172631 1164705 0 10:59 pts/1 00:00:00 grep --color=auto nginx
- 关闭Nginx
[root@localhost sbin]# ./nginx -s stop
### 查看进程
[root@localhost sbin]# ps -ef | grep nginx
root 1172429 1164705 0 10:58 pts/1 00:00:00 grep --color=auto nginx
- 重加载
[root@localhost sbin]# ./nginx -s reload
重加载命令:当我们对Nginx的配置文件进行修改后,可以通过重加载命令来使修改后的配置文件生效,而不需要重启Nginx服务器。
Nginx的配置文件
Nginx的配置文件位置
/usr/local/nginx/conf/nginx.conf
Nginx 配置文件的组成
1. 全局块
从配置文件开始到
events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程PId存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置:
worker_processes 1;
这是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
2. events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process(工作进程)下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种 事件驱动模型来处理连接请求,每个work process 可以同时支持的最大连接数。
上图中events块中 表示每个 work process 支持的最大连接数为 1024。
这部分的配置对Nginx 的性能影响较大,在实际中应该灵活配置。
3. http块
这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http块也可以包括http全局块、server块。
- http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
- server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http块 可以包括多个server块,而每个server块就相当于一个虚拟主机。
而每个server块 也分为全局 server块,以及可以同时包含多个 location块。
-
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
-
location块
一个server块可以配置多个location块。
这块的主要作用是基于Nginx服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对待定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
下面是nginx的配置文件内容:
#user nobody;
#开启的线程数,一般跟逻辑CPU核数一致
worker_processes 1;
# 定位全局错误日志文件,级别以notice显示,还有debug,info,warn,error,crit模式,
# debug输出最多,crir输出最少,根据实际环境而定
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定进程id的存储文件位置
#pid logs/nginx.pid;
events {
#定义每个进程的最大连接数,受系统进程的最大打开文件数量限制。
worker_connections 1024;
}
http {
# 主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,
# DNS主配置文件中的zonerfc1912,acl基本上都是用include语句。
include mime.types;
# 核心模块指令,智力默认设置为二进制流,也就是当文件类型未定义时使用这种方式
default_type application/octet-stream;
# 下面代码为日志格式的设定,main为日志格式的名称,可自行设置,后面引用
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 引用日志main
#access_log logs/access.log main;
#设置允许客户端请求的最大的单个文件字节数
#client_max_body_size 20M;
#指定来自客户端请求头的headebuffer大小
#client_header_buffer_size 32k;
#指定连接请求试图写入缓存文件的目录路径
#client_body_temp_path /dev/shm/client_body_temp;
#指定客户端请求中较大的消息头的缓存最大数量和大小,目前设置为4个32KB
#large client_header_buffers 4 32k;
#开启高效文件传输模式
sendfile on;
#开启防止网络阻塞
#tcp_nopush on;
#设置客户端连接保存活动的超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
#设置客户端请求读取超时时间
#client_header_timeout 10;
#设置客户端请求主体读取超时时间
#client_body_timeout 10;
#用于设置相应客户端的超时时间
#send_timeout
#开启gzip压缩
#gzip on;
#设置允许压缩的页面最小字节数
#gzip_min_length 1k;
#申请4个单位为16K的内存作为压缩结果流缓存
#gzip_buffers 4 16k;
#设置识别http协议的版本,默认为1.1
#gzip_http_version 1.1;
#指定gzip压缩比,1-9数字越小,压缩比越小,速度越快
#gzip_comp_level 2;
#指定压缩的类型
#gzip_types text/plain application/x-javascript text/css application/xml;
#让前端的缓存服务器进过gzip压缩的页面
#gzip_vary on;
#########Nginx的server虚拟主机配置
server {
#监听端口为 80
listen 80;
#设置主机域名
server_name localhost;
#设置访问的语言编码
#charset koi8-r;
#设置虚拟主机访问日志的存放路径及日志的格式为main
#access_log logs/host.access.log main;
#设置虚拟主机的基本信息
location / {
#设置虚拟主机的网站根目录
root 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 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;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Nginx 配置实例-反向代理
一、实现效果
打开浏览器,在浏览器地址栏输入:www.123.com,跳转到Linux系统的tomcat主页面。
二、准备工作
-
需要在Linux上安装tomcat,使用默认端口8080
将tomcat安装包文件放到liunx系统中,解压进入tomcat的bin目录中,
./startup.sh启动tomcat服务器 -
对外开放访问的端口
[root@localhost /]# firewall-cmd --add-port=8080/tcp-permanent
[root@localhost /]# firewall-cmd --reload
- 查看已经开放的端口号
[root@localhost /]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s20f0u5
sources:
services: cockpit dhcpv6-client ssh
ports: 3306/tcp 8080/tcp 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 访问tomcat的服务器:
192.168.2.253:8080
三、访问过程的分析
四、具体配置
- 在Windows系统的host文件进行域名和IP对应关系的配置
打开该文件,在文件最后一行加上Nginx服务器的ip地址和对应的域名,如下
192.168.2.253 www.123.com
配置完成后保存,然后在浏览器上输入:wwww.123.com:8080 就可以访问到Linux上的tomcat服务器了。
- 在nginx的配置文件中进行请求转发的配置
按照上图所示,编辑
nginx.conf文件,编辑完成后不要忘记重加载配置文件,使配置生效。
五、最终测试
在浏览器输入:www.123.com,就会跳转到Linux的tomcat服务器页面,如下图所示:
Nginx配置实例-反向代理2
一、实现效果
使用Nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001。
访问 http://192.168.2.253:9001/edu/a.html 直接跳转到127.0.0.1:8080/edu/a.html
访问 http://192.168.2.253:9001/vod/a.html 直接跳转到 127.0.0.1:8081/vod/a.html
二、准备工作
1. 准备两个tomcat服务器,一个8888端口,一个9999端口
[root@localhost local]# ls
bin etc games include lib lib64 libexec nginx sbin share src tomcat01 tomcat02
我这里已经准备好两个tomcat了。
- tomcat01目录下放置的tomcat端口号是8888
- tomcat02目录下放置的tomcat端口号是9999
2. 创建文件夹和测试页面
在/tomcat01/webapps/目录下创建一个edu文件夹,放置一个a.html文件。里面的内容如下:
<h1>8888<h1>
在/tomcat02/webapps/目录下创建一个vod文件夹,放置一个a.html文件。里面的内容如下:
<h1>9999<h1>
3. 具体配置
找到nginx的配置文件,进行反向代理配置,按照下图配置即可:
配置完成后不要忘记开放9001端口,然后重启nginx服务器。
4. 最终测试
location指令说明
该指令用于匹配URL,语法如下:
location[ = | ~ | ~* | ^~ ] uri{
}
-
=:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 -
^~:对URI的左半部分做匹配检查,不区分字符大小写。 -
~:对URI做正则表达式模式匹配,区分字符大小写。 -
~*:对URI做正则表达式模式匹配,不区分字符大小写。 -
不带符号:匹配起始于此uri的所有的url。
匹配优先级:=, ^~, ~/~*,不带符号
- 实例:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
说明:如果是用户请求uri是/ 那么在以上location中将匹配到A,如果是/index 将匹配到B,如果是/documents/index将匹配到C,如果是/images/1.jpg将匹配到D和E,但是D的优先级高于E,所有应用D的配置,如果是/document/1.jpg将匹配到C和E,但是E的优先级高于C,所以会应用E的配置;
看下面一个例子:
server{
listen 80;
server_name www.ljb.com;
# 匹配以/api/开头的请求,^~和/api/之间有一个空格
location ^~ /api/ {
# 注意域名后面有一个 /
proxy_pass http://www.zlj.com/;
}
}
没错就是proxy_pass后面的地址加一个/
- 加
/的情况:访问www.ljb.com/api/login.json会得到www.zlj.com/login.json(符合预期的)。 - 不加
/的情况,访问www.ljb.com/api/login.json会得到www.zlj.com/api/login.json(不符合预期)。
Nginx配置实例-负载均衡
一、实现效果
在浏览器地址栏输入地址 http://192.168.2.253/edu/a.html,负载均衡效果,平均请求到8888和9999端口中。
二、准备工作
-
准备两台tomcat服务器,一台8888,一台9999。
-
在两台tomcat里面的webapps目录中,创建名称是edu的文件夹,在edu文件夹中创建页面a.html,用于测试。
端口号为8888的tomcat服务器中放置的a.html文件内容为:
<h1>8888</h1>端口号为9999的tomcat服务器中放置的a.html文件内容为:
<h1>9999</h1>
三、配置Nginx
在nginx的配置文件中进行负载均衡的配置
按照上图配置完成后重启nginx服务器,使配置生效。
上图没有配置nginx分配服务器的策略,默认使用轮询策略:每个请求按时间顺序逐一分配到不同的后台服务器,如果后台服务器down掉,能自动剔除。
还可以使用下面几种常用策略:
- weight:代表权重,默认为1,权重越高被分配的客户端越多。
upstream server_pool{ server 192.168.2.253 weight=10; server 192.168.2.253 weight=5; } - ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream server_pool{ ip_hash; server 192.168.2.253; server 192.168.2.253; } - fair(第三方):按照服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{ server 192.168.2.253; server 192.168.2.253; fair; }
四、效果演示
Nginx配置实例-动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。
一、实现效果
在浏览器输入:http://192.168.2.253/image/a.jpg 本次请求交个nginx服务器来处理,不会在转发给tomcat来处理。
二、准备工作
创建 /data/image/目录,在该目录下存放一张图片:
[root@localhost image]# ls
a.jpg b.jpg china.jpg
三、Nginx配置
编辑Nginx的配置文件如下:
四、效果演示
由于在配置location为/image/的时候指定了autoindex on,所以访问:http://192.168.2.253/image/ 时就会列出访问目录:
Nginx配置https
在开始配置之前确保你已经有了证书, 当我们的Linux服务器上发布了web项目,有时候需要去配置一个SSL证书,来使用https访问。然而我面一开始编译的Nginx的时候并没有把SSL模块一起编译进去。
1. 查看Nginx是否安装ssl模块
查看命令如下:
[root@hrkj-server-1 /]# nginx -V
如上图所示我已经安装了ssl模块,如果没有安装需要进行安装,才能配置https。
- 到nginx的解压目录下,输入如下命令:
./configure –with-http_ssl_module - 当执行上面语句,出现
./configure: error: SSL modules require the OpenSSL library,使用下面命令解决。yum -y install openssl openssl-devel - 使用
make命令编译(使用make install会重新安装nginx),此时当前目录会出现objs文件夹。 - 然后用新的nginx文件覆盖当前的nginx文件
cp ./objs/nginx /usr/local/nginx/sbin/
2.将ssl证书放到指定目录下
我的ssl在如下路径下存放
[root@hrkj-server-1 certificate]# ls
ha.key ha.pem
3.编译nginx.conf配置文件
修改nginx文件的server块如下:
server{
listen 9700 ssl; # 开启ssl
server_name www.***.fit; # 域名
# 证书存放位置
ssl_certificate /home/project/certificate/ha.pem;
ssl_certificate_key /home/project/certificate/ha.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 协议
ssl_ciphers HIGH:!aNULL:!MD5;
location /images/{
root /home/project/sscs;
}
}
然后保存重启nginx服务器。
4.使用https协议访问
访问地址效果如下: