【Nginx笔记】Nginx的基本使用
本篇文章大纲
新项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部Tomcat返回内容给用户。
但是当用户越来越多的时候,并发量就慢慢增加了,这时候一台服务器就满足不了我们的需求了。于是横向扩展,又增加了服务器,这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望它可以按照服务器的性能提供不同的权重选择,保证最佳体验!所以我们使用了Nginx。
1、什么是Nginx
Nginx 是一个高性能的HTTP和反向代理web服务器
,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
简单说就是:Nginx 是一个高性能的 HTTP 和反向代理web服务器,特点是占用内存少,并发能力强。
2、Nginx作用
2.1、正向代理
正向代理的用途:
访问原来无法访问的资源,如Google。
可以做缓存,加速访问资源。
对客户端访问授权,上网进行认证。
代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。
2.2、反向代理
反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。
例如某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,并且通过封装Nginx和其他的组件之后起了个高大上的名字:Tengine。
通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,Nginx 服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。
此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx 扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
2.3、负载均衡
已经明确了所谓代理服务器的概念,那么接下来,Nginx扮演了反向代理服务器的角色,它是依据什么样的规则进行请求分发的呢?不同的项目应用场景,分发的规则是否可以控制呢?
这里提到的客户端发送的、Nginx反向代理服务器收到的请求数量,就是我们说的负载量。
请求数据按照一定的规则进行分发到不同的服务器处理规则,就是一种均衡规则。
负载均衡:增加服务器的数量,构建集群,将客户端的多个请求分发到各个服务器上。
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如 F5 负载均衡,相对造价昂贵成本较高。
但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作。
更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。
轮询(默认)
接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。
加权轮询
可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率。权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
Ip hash
iphash对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求(session)分发给同一台服务器(指定)进行处理,可以解决session不共享的问题。但是这样还是会有问题:性能不会很好,而且服务器如果宕机了,数据会丢失。所以建议还是使用Redis来处理session共享的问题。
2.4、动静分离
动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度,同时也降低单个服务器的压力。
通过使用Nginx能提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!
3、Nginx的安装
3.1、Windows下安装
1、下载nginx
http://nginx.org/en/download.html 下载稳定版本。(Stable version)
以 nginx/Windows-1.18.0 为例,直接下载 nginx/Windows-1.18.0 。
2、启动nginx
有很多种方法启动nginx:
(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过
(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe
3、配置监听
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80(即如果使用了80端口,会被nginx拦截),如果80端口被占用可以修改为未被占用的端口即可。将listen里的80改为8890即可。
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload
即可让改动生效。
4、检查nginx是否启动成功
5、关闭nginx
如果使用cmd命令窗口启动nginx,关闭cmd窗口是不能结束nginx进程的,可以使用两种方法关闭nginx。
(1)输入nginx命令:nginx -s stop
(快速停止nginx)或 nginx -s quit
(完整有序的停止nginx)。
(2)使用taskkill:taskkill /f /t /im nginx.exe
taskkill是用来终止进程的。
/f是强制终止 。
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称。
【注意】:如果关闭nginx后仍然可以访问,说明之前你是打开了多个nginx,可以直接使用上面的(2)命令关闭所有进程即可。
3.2、Linux下安装
1、安装gcc
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,则需要安装:
yum install gcc-c++
2、PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
3、zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
5、下载安装包
下载完毕上传到服务器上 /root
6、解压
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
7、配置
使用默认配置,在nginx根目录下执行
./configure
make
make install
查找安装路径:whereis ngin
4、Nginx常用命令
cd /usr/local/nginx/sbin/
./nginx -v 查看版本
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
启动成功访问服务器ip:80
【注意】:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!
相关命令:
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
5、Nginx配置文件
Nginx配置文件(nginx.conf),分三部分组成:
①全局块
从配置文件开始到events块之间,主要是设置一些影响Nginx服务器整体运行的配置指令。
并发处理服务的配置,值越大,可以支持的并发处理量越多,但是会受到硬件、软件等设备的制约。
②events块
影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多workprocess下的网络连接进行序列化,是否允许同时接收多个网络连接等等。
支持的最大连接数:
③HTTP块
诸如反向代理和负载均衡都在此配置
location[ = | ~ | ~* | ^~] url{
}
location 指令说明,该语法用来匹配url,语法如上:
=:用于不含正则表达式的 url 前,要求字符串与 url 严格匹配,匹配成功就停止向下搜索并处理请求。
~:用于表示 url 包含正则表达式,并且区分大小写。
~*:用于表示 url 包含正则表达式,并且不区分大小写。
^~:用于不含正则表达式的 url 前,要求 Nginx 服务器找到表示 url 和字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再匹配。
如果有 url 包含正则表达式,不需要有 ~ 开头标识。
6、反向代理实战
①配置反向代理
②具体实现
先在Linux里配置Tomcat,官网下载Tomcat,上传至Linux里,解压,启动即可。
(不明确的可以参考:https://blog.csdn.net/qq_41649001/article/details/105443046)
具体流程图:
修改之前:
修改配置:
注意:这里只需要在windows上修改配置即可。
1、首先修改hosts(添加)
#nginx测试Linux地址
192.168.14.205 www.123.com
2、修改nginx配置文件
3、再次访问:(因为我windows里设置的端口号与Linux里的不一样,所以这里要加上才行)
反向代理小结
然后默认访问80端口,而通过Nginx监听80端口代理到本地的8080端口上,从而实现了访问www.123.com ,最终转发到Tomcat 8080上去。
7、负载均衡实战
①修改 nginx.conf,如下图:
②重启 Nginx:
./nginx -s reload
③在 8080 的 Tomcat 的 webapps 文件夹下新建 edu 文件夹和 a.html 文件,填写内容为 8080端口号的Tomcat。
在 8081 的 Tomcat 的 webapps 文件夹下新建 edu 文件夹和 a.html 文件,填写内容为 8081端口号的Tomcat。
负载均衡方式如下:
轮询(默认)。
weight,代表权,权越高优先级越高。
fair,按后端服务器的响应时间来分配请求,相应时间短的优先分配。
ip_hash,每个请求按照访问 ip 的 hash 结果分配,这样每一个访客固定的访问一个后端服务器,可以解决 Session 的问题。
8、动静分离实战
什么是动静分离?把动态请求和静态请求分开,而不是说动态页面和静态页面的物理分离,可以理解为Nginx处理静态页面,Tomcat处理动态页面。
动静分离大致分为两种:
纯粹将静态文件独立成单独域名放在独立的服务器上,也是目前主流方案。
将动态跟静态文件混合一起发布,通过Nginx分开。
动静分离图析:
实战准备,准备静态文件:
在安装目录的根目录里,可以新建一个文件夹Test,在子文件other里面放一些静态资源:
然后在配置文件里添加配置
9、Nginx高可用
如果Nginx出现问题:(借鉴网上的)
解决方法:
前期准备:
两台 Nginx 服务器
安装 Keepalived
虚拟 ip
安装 Keepalived:
[root@192 usr]# yum install keepalived -y
[root@192 usr]# rpm -q -a keepalived
keepalived-1.3.5-16.el7.x86_64
修改配置文件:
[root@192 keepalived]# cd /etc/keepalived
[root@192 keepalived]# vi keepalived.conf
分别将如下配置文件复制粘贴,覆盖掉keepalived.conf,虚拟ip为192.168.25.50。
对应主机ip需要修改的是:
smtp_server 192.168.25.147(主)smtp_server 192.168.25.147(备)
state MASTER(主) state BACKUP(备)
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.25.147
smtp_connect_timeout 30
router_id LVS_DEVEL # 访问的主机地址
}
vrrp_script chk_nginx {
script "/usr/local/src/nginx_check.sh" # 检测文件的地址
interval 2 # 检测脚本执行的间隔
weight 2 # 权重
}
vrrp_instance VI_1 {
state BACKUP # 主机MASTER、备机BACKUP
interface ens33 # 网卡
virtual_router_id 51 # 同一组需一致
priority 90 # 访问优先级,主机值较大,备机较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.50 # 虚拟ip
}
}
启动代码如下:
[root@192 sbin]# systemctl start keepalived.service
访问虚拟ip成功:
关闭主机 147 的 Nginx 和 Keepalived,发现仍然可以访问。