Nginx
Nginx是什么
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
说白了Nginx就是在tomcat之前加了一成东西,通过这个东西我们可以控制对tomcat的访问
安装Nginx
注意点
1、下载Nginx 官网地址http://nginx.org
2、安装nginx之前需要安装pcre、openssl、zlib、gcc依赖。
安装pcre依赖
第一步 联网下载pcre压缩文件依赖
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
第二步 解压压缩文件
使用命令tar –xvf pcre-8.37.tar.gz
第三步./configure完成后,回到pcre目录下执行make,最后执行make install
安装其他依赖
安装openssl、zlib、gcc依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
安装nginx
1.使用命令解压文件
2.进入文件使用./configure
3.make && make install
4.进入目录/usr/local/nginx/sbin/nginx启动服务, 命令: ./nginx
测试
输入linux的地址即可,nginx默认端口为80
在浏览器查看是否启动成功
关于防火墙问题
在windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题
(1)关闭防火墙
(2)开放访问的端口号,80 端口
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
service firewalld restart
Nginx的常用的命令
进入 nginx 目录中
cd /usr/local/nginx/sbin
1、查看 nginx 版本号
./nginx -v
2、启动 nginx
./nginx
3、停止 nginx
./nginx -s stop
4、重新加载 nginx
./nginx -s reload
Nginx的配置文件
文件地址
cd /usr/local/nginx/conf/
配置文件内容
- 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- 5、location块:配置请求的路由,以及各种页面的处理情况
配置文件详解
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
Nginx的反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
Nginx的反向代理只需要配置文件即可,在配置文件的http 模块下找到server。
我们这里使用两个springboot项目和一个tomcat.springboot项目端口分别为6999、6998,这两个程序的访问方法如下:
springboot
6998的程序
@RestController
public class NginxController {
@Value("${server.port}")
String port;
@RequestMapping("getname6998")
public String getName(String name){
return port+" name:"+name;
}
}
6999的程序
@RestController
public class NginxController {
@Value("${server.port}")
String port;
@RequestMapping("getname")
public String getName(String name){
return port+" name:"+name;
}
}
nginx配置
需要注意的是这里前缀必须是项目中的真实路径,如果不是则找不到请求则报404.如 location /getname/{}里的getname必须是项目中的真实路径。
server {
listen 80; // 端口号(我们代理服务器的端口号)
server_name 39.100.233.183;// IP地址(我们代理服务器的IP地址)
//不输入前缀则进入我们的tomcat
location / {
root html;
proxy_pass http://39.100.233.183:8080; //转发服务器地址及其端口
index index.html index.htm;
}
//输入6999程序的访问路径者转发到6999服务器上
location /getname/{
proxy_pass http://39.100.233.183:6999; //转发服务器地址及其端口
}
//输入6998程序的访问路径者转发到6999服务器上
location /getname6998/{
proxy_pass http://39.100.233.183:6998; //转发服务器地址及其端口
}
}
测试
访问6998的路径,我们的请求被转发到6998这个服务器里
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85ruoAAY-1606998341855)(Nginx.assets/image-20201203173721536.png)]
访问6999的路径,我们的请求被转发到6999这个服务器里
这就是Nginx的反向代理,通过一个nginx服务器可以根据不同的请求转发到不同的服务器上。
负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
简单来说就是一个业务模块放在不同的服务器上,我们可以控制对每个请求在服务器上的请求次数。
创建springboot
我们使用springboot创建两个web项目,端口分别为6999、6998.为了区分,我设置访问路径一样,里面的实现不一样。
如:
6998端口的请求如下:
@RequestMapping("getname")
public String getNames(String name){
return port+" =====负载均衡 name:"+name;
}
6999端口的请求如下
@RequestMapping("getname")
public String getName(String name){
return port+" name:"+name;
}
在nginx配置下配置
1、在http下创建upstream myserver(myserver是可以自定义的),里面添加服务地址和端口。
2、server下的location设置proxy_pass为proxy_pass http://myserver;
http {
upstream myserver{
server 39.100.233.183:6998;
server 39.100.233.183:6999;
}
server {
listen 80;
server_name 39.100.233.183;
location / {
proxy_pass http://myserver; //myserver上面配置的负载均衡的名字
}
}
测试
第一次为6999端口程序
刷新后为6998端口程序
经过测试知道我们同一个请求,可以向不同的服务器上请求。
策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、weight
weight 代表权重,默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstream server_pool{
server 192.168.5.21 weight=10;
server 192.168.5.22 weight=10;
}
3、ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。例如:
upstream server_pool{
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
server 192.168.5.21:80;
server 192.168.5.22:80;
fair;
}
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
简单说就是把图片、html等静态资源放在另外一台服务上,访问时直接访问这个服务器,不用去找tomcat.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4A2Mxqz-1606998341861)(Nginx.assets/image-20201203192808997.png)]
准备工作
在linux系统根目录下创建一个文件data,并在里面创建两个文件html、image.在html文件夹下存放一个a.html文件,在image文件中存放一张图片a.png。
配置文件
在server中添加location,/xxx/表示请求路径,root表示在那个文件夹下
location /html/ {
root /data/; //文件路径
index index.html index.htm;
}
location /image/ {
root /data/;//文件路径
autoindex on;//开启图片索引页面
}
测试
http://39.100.233.183/html/a.html可以访问我们在根目录下的a.html
输入http://39.100.233.183/image/可以看到我们的索引视图
输入:http://39.100.233.183/image/a.png可以查看根目录下的图片