一、Nginx简介
简单来讲,Nginx就是一个服务器,它可以作为http服务器、反向代理服务器,也可以作为邮件代理服
务器。
Nginx的特点是占用内存少,并发处理能力强(nio)。Nginx的并发处理能力在同类的Web服务器中表现
极好,有大量的网站使用了Nginx,如的:淘宝、新浪、搜狐、网易、美团等。
Nginx是开源免费的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机紧急处理等技
术支持和服务。
二、Nginx环境搭建
0、安装前置库
下载阿里云 CentOS 7 镜像源
# 下载阿里云 CentOS 7 基础源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 下载阿里云 Epel 源(扩展包)
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
清理并重建 YUM 缓存
# 清理旧缓存
yum clean all
# 重建缓存
yum makecache
完成以上配置后,再执行你需要的安装命令:
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 安装编译器、依赖库、开发工具
sudo yum install -y gcc gcc-c++ make automake autoconf libtool
# 安装核心依赖(正则、压缩、SSL)
sudo yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
1、下载安装

在nginx安装包的根目录下执行configure脚本
配置安装路径
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
configure是用于做配置的,-prefix指定了nginx的安装路径,这里仅仅只是指定安装路径,并没有真
正安装nginx。执行完该脚本后,会生成一个objs文件夹
编译
make
安装
make install

进入nginx的安装好以后的根路径

conf文件夹中存放了nginx的配置文件。其中包含了nginx的主配置文件:nginx.conf
html文件夹中存放了nginx默认的页面:50x.htmlindex.html
logs文件夹中将会存放nginx的日志文件,当访问nginx后,access.log就会记录访问信息
sbin文件夹中包含了nginx的启动命令:nginx
2、配置Nginx环境变量
启动Nginx
/usr/local/nginx/sbin/nginx

nginx -c /usr/local/nginx/conf/nginx.conf
当我们键入nginx命令启动nginx服务时,默认使用的就是以上的配置文件

关闭Nginx
./nginx -s stop

优雅地关闭nginx:不再接收新的请求,等正在处理的请求全部完成后再关闭nginx服务
nginx -s quit
让nginx重读nginx自己的配置文件,但不会重启服务
nginx -s reload
要实现任何位置输入nginx执行运行,需要配置环境变量:
export PATH=$PATH:/usr/local/nginx/sbin



netstat -tunlp
yum -y install net-tools

检查配置
当修该nginx的配置后,可以使用以下命令对配置文件进行语法检查:

3、防火墙配置
[root@localhost yt]# firewall-cmd --add-port=80/tcp
success
[root@localhost yt]# firewall-cmd --add-port=80/tcp --permanent
success
[root@localhost yt]# firewall-cmd --reload
success
[root@localhost yt]# firewall-cmd --list-all

浏览器访问正常

三、Nginx主要目录简介

conf文件
备份源配置文件:
cp nginx.conf nginx.conf.bak

html文件
[root@localhost html]# ls
50x.html index.html

验证一下是在index.html
在该HTML最后追加内容:
echo '<br /> I AM NGINX <br />' >> index.html


logs文件

注意:

误删后的解决办法:
[root@localhost logs]# ps -ef | grep nginx
root 14399 1 0 17:45 ? 00:00:00 nginx: master process nginx -c /usr/local/nginx/conf/nginx.conf
nobody 14400 14399 0 17:45 ? 00:00:00 nginx: worker process
root 14698 14680 0 18:19 pts/2 00:00:00 grep --color=auto nginx
[root@localhost logs]# kill -9 14399
[root@localhost logs]# kill -9 14400
[root@localhost logs]# ps -ef | grep nginx
root 14700 14680 0 18:20 pts/2 00:00:00 grep --color=auto nginx
[root@localhost logs]# nginx
[root@localhost logs]# ll
总用量 4
-rw-r--r--. 1 root root 0 3月 19 18:21 access.log
-rw-r--r--. 1 root root 0 3月 19 18:21 error.log
-rw-r--r--. 1 root root 6 3月 19 18:21 nginx.pid



sbin文件

四、Nginx常见用法
先备份一下nginx.conf配置文件

Nginx配置文件语法规则
a.Nginx的配置文件由指令与指令块构成
b.每条指令以";"结尾,指令与参数之间以空格分隔
c.指令块以"{ }"将多条指令组织在一起
d.使用#来添加注释

全局块
全局配置作用于所有的虚拟主机。
#配置哪个用户可以运行worker进程,这里指定nobody用户,也就是所有用户
#nobody是一个linux系统的用户,往往用于启动服务,没有密码,无法直接登录
user nobody;
#配置worker工作进程的数目,通常设置为服务器cpu的数量或cpu数量的2倍,为了高并发
worker_processes 1;

[root@localhost conf]# vi nginx.conf
[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx
[root@localhost conf]# ps -ef | grep nginx
root 14754 1 0 18:35 ? 00:00:00 nginx: master process nginx
nobody 14755 14754 0 18:35 ? 00:00:00 nginx: worker process
nobody 14756 14754 0 18:35 ? 00:00:00 nginx: worker process
nobody 14757 14754 0 18:35 ? 00:00:00 nginx: worker process
nobody 14758 14754 0 18:35 ? 00:00:00 nginx: worker process
root 14760 14680 0 18:35 pts/2 00:00:00 grep --color=auto nginx
nobody用户启动worker进程

#配置日志级别:debug info notice warn error crit,默认是error,大于该级别的日志会进行记录
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#配置进程pid文件
#pid logs/nginx.pid;

nginx.pid文件中存放着当前启动nginx后,nginx进程的pid,当关闭nginx服务后,该文件也会被删除

events块
events {
#配置每个worker进程的连接数上限
#nginx支持的总连接数: worker_processes * worker_connection
worker_connections 1024;
}
注意,worker_connection的最大值是65535
http块
http块可以包含多个server块,每一个server块配置的都是一个虚拟主机,而一个server块中又可以包含多个location块,每一个location块都是一个虚拟主机中的一个资源路径。在server块以外的内容,是所有server的公共基础配置。(提醒自己:先学虚拟主机配置,再学其他配置)
将Nginx中配置的注释行全部删除:
删除前:

删除注释之后:
worker_processes 4;
events {
worker_connections 1024;
}
http {
#include用于引入mime.types文件,nginx会在nginx.conf所在路径找该文件
#配置虚拟主机支持的数据类型,在mime.types文件中描述了很多数据类型
include mime.types;
#如果是虚拟主机不能识别的数据类型,则直接使用二进制流传输
#此时浏览器会提示下载
default_type application/octet-stream;
#开启零拷贝(nio),通俗讲就是开起高效文件传输模式
sendfile on;
#HTTP有一个KeepAlive模式,它告诉webserver在处理完一个
#请求后保持这个TCP连接的打开状态。若接收到来自客户端的其它
#请求,服务端会利用这个未被关
#闭的连接,而不需要再建立一
#个连接。KeepAlive在一段时间内保持打开状态,它们会在这段时
#间内占用资源。占用过多就会影响性能。Nginx使用keepalive_timeout
#来指定KeepAlive的超时时间。指定每个TCP连接最多可以保持多长时间。
#Nginx的默认值是75秒,有些浏览器最多只保持60秒,所以可以设定为
#60秒。若将它设置为0,就禁止了keepalive连接。
keepalive_timeout 65;
#使用gzip压缩响应数据,在响应数据较大的情况下
#服务器会使用gzip方式压缩数据,并通过响应头
#Content-Encoding告诉浏览器使用gzip格式解压
#gzip on;
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;
}
}
}

Nginx虚拟主机配置
配置虚拟主机讲解:
# 配置虚拟主机
server {
listen 80;
server_name localhost;
# "/"表示通用匹配,当请求无法匹配其他1ocation时,就会匹配到该location
location / {
#root用于转换请求路径中的"/"为html
root html;
#当"/"后面没有写资源名的时候,就寻找index.html或index.htm
#index这个配置,只能用于"/"这个通用路径
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
# "="表示精确匹配
location = /50x.html {
root html;
}
}



五、部署静态网站
Nginx是一个可以接收HTTP请求,且发出HTTP响应的web服务器。web服务器上只能部署静态资源(HTML、JS、CSS、图片),它无法解析处理动态资源(JSP、Servlet)。所以动态资源不要部署到Nginx服务器上。
准备一个静态网站
静态网站:disney

修改nginx.conf的配置,配置路径


重启Nginx

注意:开启防火墙
# 格式:firewall-cmd --add-port=端口号/协议 --permanent
firewall-cmd --add-port=8080/tcp --permanent
# 关键步骤:重新加载防火墙规则,使永久配置生效
firewall-cmd --reload

访问修改之后的情况:

六、负载均衡搭建
负载均衡概述
在一个网站创立初期,我们一般都使用单台机器对外提供集中式服务。随着业务量的增大,一台服务器的压力会越来越大,此时就会使用"集群"对外提供服务,所谓负载均衡就是将请求分配给集群中不同的服务器节点上。
Nginx负载均衡原理图

准备tomcat
配置woniusales:Tomcat下配置woniusales-CSDN博客

解压到指定目录,注意和上面jdk的路径要保持一致
tar -zxvf apache-tomcat-8.5.59.tar.gz -C /usr/soft/

配置环境变量
vi ~/.bash_profile
执行环境变量的配置:
source .bash_profile
准备好2个tomcat服务,分别占用8006&8081、8007&8082端口

修改t8081的配置,占用8006&8081
vi t8081/conf/server.xml




修改t8082的配置,占用8007&8082端口
vi t8082/conf/server.xml



分别启动8081、8082服务

防火墙开放8081、8082端口



截止到现在,并没有实现负载均衡,分别是通过Tomcat的不同端口号进行访问的,想要实现负载均衡需要再Nginx中配置,使其从同一的入口进行访问。
Nginx负载均衡配置
cd /usr/local/nginx/
vi conf/nginx.conf
upstream myloadbalance {
server 192.168.102.149:8081;
server 192.168.102.149:8082;
}
server {
listen 8888;
server_name loadbalance;
location / {
proxy_pass http://myloadbalance;
}
}


vi /usr/soft/t8081/webapps/ROOT/index.jsp

vi /usr/soft/t8082/webapps/ROOT/index.jsp

负载均衡配置成功:


七、负载均衡策略
轮询(默认)
Nginx会将请求均匀地转发给tomcat服务器
权重轮询
使用的是平滑加权轮询算法

八、反向代理和正向代理
反向代理的特点:
1.客户端不知道自己的请求最终会被转发到哪个服务器上。
2.反向代理,是存在于服务器端的
正向代理的特点:
1.客户端知道自己的请求,最终会被转发到哪个服务器上。
2.正向代理,是存在于客户端的

九、静态代理
所谓的静态代理,就是把静态资源部署到Nginx服务中,而不是部署到tomcat中。因为Nginx更擅长于
静态资源的处理(支持0拷贝),性能更好,效率更高!所谓静态资源,就是:html,css,Js,jpg...
所以在实际应用中,我们将静态资源(图片、css、htmI、js等)都交给Nginx处理,而不是由tomcat
处理。
静态代理实现方式一
在nginx.conf的location中配置静态资源的后缀
1ocation ~.*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt){
root /opt/static
}
~表示正则匹配,也就是说后面的内容是正则表达式。以上整个配置表示:以这些指定后缀结尾的文件都由nginx处理。
要注意放置静态资源的目录,如果用户对该目录的操作权限不足的话,就是出现403的错误,可以通过"chmod 777"来设置所有用户都能对该目录进行"读、写、执行"的操作。
静态代理实现方式二
location ~.*/(css|js|img|images){
root /opt/static;
}
以下的ip地址:192.168.88.129是Nginx服务器的ip地址。
比如,用户访问http://192.168.88.129/myweb/css/all.css,则nginx就会访问到linux系统中的这个目录: /opt/static/myweb/css/all.css
比如,用户访问http:/192.168.88.129/myweb/js/index.js,则nginx就会访问到linux系统中的这个目录: /opt/static/myweb/js/index.js
比如,用户访问http://192.168.88.129/myweb/img/a.jpg,则nginx就会访问到linux系统中的这个目录: /opt/static/myweb/img/a.jpg
十、动静分离
没有动静分离的日子里:

有了动静分离的日子里:

Nginx的动静分离,一般用于前后端分离,我们会把前端应用直接部署到Nginx服务器中。
十一、会话共享
分布式会话解决方案:
1.ip_hash

2.会话复制(不推荐,面试的谈资)
3.第三方管理会话
这里我们学习一下会话复制的解决方案
1.修改2个tomcat的server.xml文件,将cluster的注释去掉

2.web应用下的web.xml,增加标签


配置改为之后重新Tomcat,Nginx。
3.让nginx重新加载配置文件,且重启2个tomcat,此时再访问nginx,会发现在不同的tomcat服务器
之间,有了相同的会话id!
注意:
2个tomcat服务器,1.要开放4000和45564端口,2.要重启防火墙,而不是重新加载防火墙
Nginx原理

一个master和多个worker的好处,可以使用热部署:nginx -s reload
对于每个worker进程来说,都是独立的进程。采用独立的进程,可以让worker之间互不干扰,一个worker退出后,其他woker不受影响,保证整个nginx服务不会中断。
woker的数量
nginx采用了io多路复用机制(select pselect poll),每个worker都是一个独立的进程,但每个进程里只有一个线程,就是主线程,通过异步非阻塞的方式来处理请求,即使是成干上万个请求,nginx也能够处理。
每个worker的线程可以把cpu的性能发挥到极致,所以worker数的最佳数量就是cpu的数量。设置少了会浪费cpu,设置多了会造成cpu频繁切换上下文,导致不必要的性能损耗!