文章目录
1. 概述
- 概述
Nginx是一款轻量级的web服务器,反向代理服务器以及电子邮件代理服务器.它是一款开源免费的web服务器,简单易上手,并在BSD-like协议下发行,是由俄国的一位工程师设计开发的,供俄国大型的入口网站以及搜索引擎使用的.
特点: 占用内存少,并发能力强.
nginx是由内核和模块两部分组成的,其中,内核的设计非常的微小和简洁,完成的工作也非常简单
仅仅通过配置文件将客户端的请求映射到一个location block (location是nginx的一个指令,用于匹配url),而这个licaltion中所有的配置的每一个指令将会启动不同的模块完成相应的工作.
在高并发的情况下,nginx是Apache服务器的一个不错的替代品
nginx既可以在内部直接支持Rails和PHP程序对外提供服务,也可以支持作为Http代理服务器对外提供服务
- 作用
- nginx一般情况下主要承担负载均衡,充当的是反向代理服务器的角色
- nginx相对于apache服务器(如tomcat)的优点
- 高并发响应性能好,官方介绍支持50000/s个并发连接数的响应(静态文件)
- 内存和CPU占用率极低,比apache服务器低(内存低1/5,cpu低1/10)
- 反向代理服务器性能强(可用于负载均衡),做后期的性能优化
- 对后端服务器有较好的健康检查机制(心跳机制)
- 配置代码简洁,而且易上手
2. Nginx的工作原理
nginx是由内核和模块两部分组成的,其中,内阁的设计非常的微小和简洁,完成的工作也非常简单
仅仅通过配置文件将客户端的请求映射到一个location block (location是nginx的一个指令,用于匹配url),而这个licaltion中所有的配置的每一个指令将会启动不同的模块完成相应的工作.
核心模块: HTTP模块, Even模块, Mail模块
基础模块: HTTP Access模块, HTTP fastCGL模块, HTTP Proxy模块,HTTP Rewritem模块
第三方模块: HTTP Request, Hash模块, Notic模块, HTTP Access Key模块
nginx高并发优势主要得益于内部采用epoll模型,相对于传统的服务器类型不一样(架构不同),epoll模型是在linux内核2.6才出现的,nginx采用epoll模型,达到异步非阻塞
apache服务器内部采用select模型
- epoll模型
epoll模型 对于事件句柄的选择不是遍历所有事件通知,而是有一个事件反馈就直接响应,也就是说 句柄事件上来立马就选择出来,不需要遍历整个事件句柄链表,因此效率极高.
- select模型
遍历所有的句柄.也就是说句柄事件响应时,select需要遍历所有的句柄才能获取到哪些句柄上有事件通知,因此效率较低.
3. Nginx的安装配置
创建nginx文件夹
cd /usr/local
mkdir nginx
- 下载nginx安装包
cd nginx
wget http://nginx.org/download/nginx-1.13.0.tar.gz
如果没有wget命令,那么需要执行 yum -y install wget- 解压
tar -zxvf nginx-1.13.0.tar.gz- 编译
cd nginx-1.13.0
./configure- 编译过程中可能出现的三个错误
- C compile cc is not fount 错误
因为缺少编译环境,安装编译源码所需要的工具和库
yum install gcc gcc-c++ ncurses-devel perl- the HTTP rewrite module requires th PCRE library
因为缺少HTTP rewrite module模块,可以禁用或安装PCRE库
安装: yum install pcre pcre-devel- the HTTP gzip module requires the zlib library
因为缺少HTTP gzip 类库,执行命令
yum install zlib gzib zlib-devel- 重新编译
./configure
- 安装nginx
make & make install- 启动nginx
cd ..
cd sbin
./nginx- 查看是否启动成功
ps -ef | grep nginx
或浏览器访问
Linux的ip:端口号
192.168.88.107:80
因为是80,所以可以省略端口号,直接输入ip就行
看到Welcome to nginx!就代表成功了- 关闭nginx
./nginx -s quit 或
./nginx -s stop- 重载nginx
./nginx -s reload
- 检查nginx的配置情况
./nginx -t- 检查nginx环境
./configure
4. Nginx管理虚拟机
虚拟机使用的是特殊的软硬件技术
它把一台运行在因特网的服务器分成一台台虚拟的主机,每一台虚拟的主机都可以是一个独立的网站.
可以具有独立的域名,完整的Internet服务器功能(www,FTP,Email)
同一台主机的虚拟机之间是完全独立的
从网站访问者来看,每一台虚拟主机和一台独立的主机是完全一样的
利用虚拟主机,不用为每一个网站提供一台单独的nginx服务器或单独运行一组nginx进程,虚拟主机提供了同一台服务器,同一组nginx进程运行多个网站的功能.
4.1Nginx的基本配置
- 三种配置机制
基于域名的配置
基于端口号的配置
基于ip的配置
- 主配置文件
nginx.conf,该主配置文件在
/usr/local/nginx/conf
vim nginx.conf
主配置文件的内容
#user nobody;
#进程数是1
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
#连接数 单进程下最大的并发量
worker_connections 1024;
#总并发量 = worker_processes * worker_connections
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; # 连接超时时间,单位为秒
#gzip on;
#配置服务器,复制一个server,代表一个服务器,管理一个新的虚拟机
server {
#监听80端口
listen 80;
#域名
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#默认访问的页面
location / {
#网站的根目录,可以是相对路径,也可以是绝对路径/usr/local/nginx/html
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;
}
}
核心部分
http{
server {
#监听80端口
listen 80;
#域名
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#默认访问的页面
location / {
#网站的根目录,可以是相对路径,也可以是绝对路径/usr/local/nginx/html
root html;
#首页
index index.html index.htm;
}
}
}
5. Nginx的负载均衡
Nginx的负载均衡
负载均衡的作用
- 转发功能
按照一定的算法(轮询,权重)将客户端的请求转发到不同的服务器上面
- 故障排除
通过心跳机制的方式,判断应用服务器当前是否处于正常工作状态.如果服务器宕机了,自动将请求转发到其他应用服务器上
- 恢复添加
如果检测到发生故障的应用服务器恢复工作,那么它会自动把恢复的应用服务器添加进去
Nginx的三种配置
- 基于域名的配置方式
- 开发步骤:
(1) 编辑nginx.conf文件,配置一个新的server
#配置一个server,就相当于配置一个服务器
server{
listen 80;
server_name com.video.com;
location / {
root jsp;
index login.html;
}
}
(2) 域名备案
在C:\Windows\System32\drivers\etc下的hosts文件最下面添加
192.168.88.107 www.video.com //自己服务器的ip和刚刚配置的域名
当客户端发出请求时,会先到本地的hosts文件找,如果找到了就会去访问,如果没有找到就会去DNS服务器,DNS服务器解析域名,然后找到对应的web服务器
(3)在nginx下创建jsp目录和上传/创建一个login.html
(4)启动nginx,在浏览器输入www.video.com
- 基于端口号的配置方式
(1) 编辑nginx.conf文件,配置一个新的server
#配置一个server,就相当于配置一个服务器
server{
listen 81;
server_name com.video.com;
location / {
root jsp;
index login.html;
}
}
(2)重载nginx
在sbin目录下 ./nginx -s reload
(3)浏览器访问
com.video.com:81
- 基于ip的配置方式
(1) 编辑nginx.conf文件,配置一个新的server
#配置一个server,就相当于配置一个服务器
server{
listen 80;
server_name 192.168.88.107;
location / {
root jsp;
index login.html;
}
}
(2)备案
在C:\Windows\System32\drivers\etc下的hosts文件最下面添加
192.168.88.107 192.168.88.107 //自己服务器的ip和刚刚配置的域名
(3)浏览器访问
192.168.88.107
6. Nginx搭建tomcat集群
开发步骤
- 准备 至少三台虚拟机—克隆
一台做nginx服务器,两台做tomcat应用服务器.
- 修改主机名 vim /etc/hostname
- 修改ip vim /etc/sysconfig/network-scripts/ifcfg-ens33
- 重启network网络 systemctl restart network
- 重启虚拟机 reboot
- 搭建tomcat集群
修改作为nginx服务器的虚拟机的nginx.conf的配置文件
upstream tomcat-server1 { #tomcat-server1代理名称,映射下面的代理请求地址 #nginx转发的应用服务器地址,weight值越大,分发的请求就越多 server 192.168.88.108:8081 weight=3; server 192.168.88.109:8082 weight=1; } server{ listen 80; server_name video.com; location / { proxy_pass http://tomcat-server1; index index.jsp;默认访问tomcat服务器首页 } }
-
启动作为代理的nginx服务器的nginx,然后分别启动tomcat
-
修改C:\Windows\System32\drivers\etc下的hosts文件
192.168.88.107 video.com (nginx服务器的ip为192.168.88.107) -
为了区分两个tomcat的首页,修改tomcat的ROOT的index.jsp
-
测试
-
浏览器输入video.com
7. Nginx的高可用
nginx除了要实现网站的高可用,也就是提供多台应用服务器(如tomcat)用于发布相同的服务,添加负载均衡服务器分发以保证高并发情况下各台服务器能相对饱和的处理请求,同样,负载均衡服务器(nginx)也需要高可用,以防止如果负载均衡服务器挂掉或宕机了,后面它所管理的应用服务器会紊乱导致无法工作.
实现高可用的方案:
添加冗余,即添加多台nginx服务器以避免发生上述的单点故障.
8. 部署项目
- 找到各个tomcat的conf下的server.xml,编辑serverxml更该端口号
cd /usr/local/tomcat/tomcat/conf
vim server.xml
在server.xml里面执行 :set number 显示行数 ,然后找到71行
在最后面的value标签下面添加
<Context path="" docBase="video" reloadable="true"/>
把项目的video.war上传到webapps下,docBase的值与war的名字一样
需要先把war包上传才能启动tomcat
关闭tomcat,然后启动tomcat
- 配置nginx的主配置文件
- 重启nginx
cd /usr/local/nginx/sbin
./nginx -s reload
在hosts文件备案
查看实时日志
切换到目录logs
使用tailf 日志文件
upstream tomcat-server1 {
#nginx转发应用服务器所在的虚拟主机的ip地址
server 192.168.88.107:8081 weight=5;
server 192.168.88.108:8082 weight=2;
server 192.168.88.109:8083 down; #表示该server不参与负载均衡
server 192.168.88.110:8084 backup; #表示其他所有没有被backup机器或down或忙时,nginx让它请求该服务
server 192.168.88.111:8085 max_fail=3; #允许请求失败的最大次数,默认为1次,默认2秒检测一次, #当失败的次数,会返回proxy_next_upstram模块定义的错误
server 192.168.88.112:8086 fail_timeout=1000;# 请求连接的超时时间
}
8.1 问题
样式丢了
虽然访问到了项目,但是样式丢了
然后我把映射tomcat的tomcat-server1改成和域名一样的www.zyvideo.com;
proxy_pass的http://tomcat-server1 改成http://www.zyvideo.com ,然后样式就出来了
修改项目中关于mysql的配置
由于我原来使用的是mysql-5.7的,但是在Linux安装的是mysql-8.0版本的,需要修改一些配置
- 修改db.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver #需要添加 .cj
jdbc.jdbcUrl=jdbc:mysql://192.168.88.107:3306/zy_video?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false #需要添加时区
jdbc.user=admin #安装mysql8时,创建的用户
jdbc.password=123456
- 修改mysql驱动包的版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
- 在application-dao.xml配置文件里的数据源配置中关闭testWhileIdle
<!--配置druid连接池依赖于 db.properties 生成dataSource对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="testWhileIdle" value="false"/>
</bean>
9. Nginx负载均衡环境中的Session共享问题
wen服务器通过nginx服务器连接起来,这样同一个IP访问同一个页面可能会被分发到不同的应用服务器上面,如果Session不同步,就会出现session在多台服务器中不共享的问题
解决方案
- 方式一: 使用session借助cookie进行缓存
这种方式容易实现,但是假如客户把cookie禁掉了,那么又会出现不同步的现象,并且cookie网络安全性较低,里面的值是可以被伪造的
- 方式二: 把session值存储到数据库中,比如存储到mysql中
虽然实现了session同步,但是会加大数据库的IO操作,增加数据库的负担,而且读写数据库效率较低
- 方式三: 把session存储到缓存中,如memcache或redis中
虽然memcache也实现了session同步,如果memcache把内存划分成很多种规格的存储块,会产生很多个内存碎片,如果存储块不充足,就会导致内存溢出现象
- 方式四: nginx自带的ip_hash
upstream tomcat-server1 {
ip_hash;
#nginx转发应用服务器所在的虚拟主机的ip地址
server 192.168.88.107:8081 weight=5;
server 192.168.88.108:8082 weight=2;
}
在upstream里添加ip_hash.能够将某个IP的请求定向到同一台服务器上,这样这个ip下的某个客户端和某个后端服务器建立了稳定的连接,实现session的同步
问题: 那么同一个ip就会一直访问同一台服务器,负载均衡就有点体现不出来了
- 方式五: upstream_hash
解决ip_hash的一些问题,可以使用upstream_hash,这个模块在大多数情况下是用作url_hash,但它也可以实现session共享