认识Nginx:
1、nginx基本概念:
1、nginx是什么?
a: Nginx 是一个高性能的http和反向代理的服务器,特点是占有内存较少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 b: Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50000个并发连接数。 详见:https://lnmp.org/nginx.html
2、反向代理:
(1)正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
nginx不仅可以做反向代理,实现负载均衡,还能用作正向代理来进行上网功能。 正向代理:如果把局域网外的Internet想象成一个巨大的资源库,而局域网中的用户要访问Internet,则需要通过代理服务器来访问,这种代理服务器称为正向代理。 举个例子: 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。 客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。 正向代理的用途: (1)访问原来无法访问的资源,如google (2)可以做缓存,加速访问资源 (3)对客户端访问授权,上网进行认证 (4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
比如公司内部需要上网代理,或者之前使用过这类软件例如CCproxy,需要在浏览器中配置代理的地址。 tip:只要局域网内有一台机器能够上网,其它机器就可以通过这台机器上安装的CCProxy来共享上网,最大程度的减少了硬件费用和上网费用。只需要在服务器上CCProxy里进行账号设置,就可以方便的管理客户端代理上网的权限,在提高员工工作效率和企业信息安全管理方面,其充当了重要的角色。
(2)反向代理
反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器地址。 反向代理的作用: (1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击 大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。 (2)负载均衡,通过反向代理服务器来优化网站的负载
3、负载均衡:
负载均衡:单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
4、动静分离:
动静分离:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
2、nginx安装、常用命令、配置文件
1、在liunx系统中安装 nginx:
vmware:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15.5.1-15018445.exe
centos7国内镜像:http://isoredirect.centos.org/centos/7/isos/x86_64/
centos7:http://mirrors.163.com/centos/7.7.1908/isos/x86_64/选择http://mirrors.163.com/centos/7.7.1908/isos/x86_64/进行下载。
1、使用远程连接工具连接linux操作系统 虚拟机ip:192.168.147.128 主要是将xshell和linux系统连接起来,这里面就要找到虚拟机的ip 在虚拟机里面输入ifconfig无法获得其虚拟ip时,可以输ip addr,发现 ens33 没有 inet 这个属性,那么就没法通过IP地址连接虚拟机,接着来查看ens33网卡的配置: vi /etc/sysconfig/network-scripts/ifcfg-ens33 *注意vi后面加空格* 这里发现最后一项 ONBOOT=no, 这里需要将其改为yes,可以按i键并移动光标修改。改完之后按ESC退出,再输入 冒号x 即“:x”,再按回车键保存并退出。然后重启网络服务: sudo service network restart,再输入ip addr 即可找到inet 这个属性后面的虚拟ip地址。再在xshell里面新建,将这个得到的ip输入连接这一条的主机里,在用户身份验证里加上root用户名,密码就会得到一个会话,再点击这个会话,再点击连接即可。 2、安装nginx相关的依赖(下面都是在xshell里面操作) (1):安装pcre(下面a是在线下载,也可以将下好的直接拖进去,直接拖时,会发现xshell报错-bash: rz :未找到命令,这是因为centos需要安装lrzsz,即输入:yum -y install lrzsz ,再拖既可以了。) a:wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 这里如果用在线下载,需要用到的wget要在centos里面下载:yum install wget b:解压文件:tar -xvf pcre-8.37.tar.gz c:进入解压之后目录,执行`./configure`检查操作(如果这一步出现error,显示是gcc和c为no,那是因为没有在centos里面安装gcc-c++编译环境,使用命令:yum install gcc-c++)。 d:make&&make install一起执行 e:安装之后,可以使用命令查看版本号:pcre-config --version (2):安装openssl (3):安装zlib 也可以使用下面的yum命令直接安装剩下的依赖(openssl、zlib) yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel 也可以一开始就这样安装所有的依赖(pcre、openssl、zlib、gcc),然后安装(4)的nginx步骤: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel (4):安装nginx a:可以将下载好的压缩文件直接拖进操作区域,或者和pcre一样操作 b:解压文件:tar -xvf nginx-1.17.8.tar.gz c:进入解压之后目录,执行`./configure`检查操作 d:再执行make && make install e:cd /usr cd进入usr文件夹 * 安装成功之后,在usr文件夹里面多出来一个文件夹local/nginx,在nginx有sbin,里有启动脚本。 3、防火墙(启动nginx后,在浏览器中输入虚拟ip地址,发现无法访问,就需要按下来设置防火墙,增加可以访问的端口) a:查看开放的端口号 firewall-cmd --list-all b:设置开放端口号 firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-port=80/tcp --permanent (一般用这个) c:重启防火墙 firewall-cmd --reload
2、nginx常用命令:
1、使用nginx命令的前提条件:进入到nginx目录中 cd /usr/local/nginx/sbin 2、查看nginx的版本号: ./nginx -v 3、启动nginx: ./nginx 此时在浏览器中输入虚拟ip地址就可以访问nginx欢迎页面了 4、关闭nginx: ./nginx -s stop 5、查看nginx进程: ps -ef | grep nginx 6、重新加载nginx: ./nginx -s reload
3、nginx的配置文件:
1、进入配置文件nginx.conf目录: cd /usr/local/nginx/conf/nginx.conf 2、配置文件组成:(里面的'#'代表注释) 配置文件由三部分组成:首先可以通过 vi nginx.conf 命令打开这个配置文件 第一部分:全局块 从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置命令,主要包 括配置运行nginx服务器的用户(组)、允许生成的worker process数、进程PID存放路径、日志存放路径 和类型以及配置文件的引入等。 比如: worker_processes 1; 这是nginx服务器并发处理服务器的关键配置,worker_processes值越大,可以支持的并发处理量也越 多,但是会受到硬件、软件等设备的制约。 第二部分:events块 events { worker_connections 1024; } events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求, 每个word process可以同时支持的最大连接数等。 上述这个events块表示每个work process支持的最大连接数为1024. 这部分对nginx的性能影响较大,在实际中应该灵活配置。 第三部分:http块 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 { listen 80; server_name localhost; #charset koi8-r; #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; } } } 这算是nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是:http模块也可以包括 http全局块、server块。 http全局块: http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求 数上限等。 server块: 这块和虚拟主机有密切的关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技 术的生产是为了节省互联网服务器硬件成本。 每个http块可以包含多个server块,而每个server块就相当于一个虚拟主机。 每个server块也分为全局server块,以及可以同时包含多个location块。 1、全局server块: 最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或者IP的配置。 2、location块: 一个server块可以配置多个location块。 这块的主要作用是基于nginx服务器接收到的请求字符串(例如:server_name/uri- string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的 /uri-string)进行 匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置 也在这里进行。
3、nginx 配置实例之反向代理
1、实现效果:
(1)、打开浏览器,在浏览器地址栏输入地址 www.123.com , 跳转到linux系统的tomcat主页面中。
2、具体实现:
(1)、在linux系统安装tomcat,使用默认端口8080
tomcat的tar.gz压缩包下载:https://pan.baidu.com/s/1VHlco23JxYDTkd-zaT3ybw 提取码:i183
这里需要javajdk ,可以先 yum -y list java* 查看yum库中的java安装包,
再安装需要的jdk版本的所有java程序:yum -y install java-11-openjdk* 这种方法不需要配置环境变量
步骤:
1、将tomcat的tai.gz压缩包放入linux系统里面的/usr/src文件夹中,tar -xvf 文件名 来解压
2、进入tomcat 文件的 bin 目录中,然后输入 ./startup.sh启动tomcat服务器
3、目录返回至tomcat的logs文件夹中,使用 tail -f catalina.out 就可以打印日志了
3、如果8080端口没有解开,要用上面防火墙哪一步进行添加
4、在浏览器输入192.168.147.128:8080就可以访问tomcat的页面了
3、访问过程的分析:
4、具体配置:
(1)、在windows系统的host文件进行域名和ip对应关系的配置
将这个hosts文件用可用的编辑器打开,在文件的最后面添加一行: 192.168.147.128 www.123.com
这个可以用cmd的管理员身份在C:\Windows\System32\drivers\etc目录下输入notepad 用记事本打开、修改、保存
(2)、在nginx里面进行请求转发的配置(反向代理的配置)、
修改之后,ctrl+c退出,再输入 :wq! 回车进行保存
5、启动nginx验证:在浏览器中输入 www.123.com 跳转到tomcat页面
1要求:
访问 http://192.168.147.128/edu/ 直接跳转到127.0.0.1:8080页面
访问 http://192.168.147.128/vod/ 直接跳转到127.0.0.1:8081页面
2、准备工作:
准备2个tomcat服务器,一个8080端口,一个8081端口
这里创建2个文件夹,里面各自放一个tomcat的tar.gz压缩包,分别解压,分别./startup.sh启动tomcat服务器
3、具体配置:
找到nginx的配置文件,进行反向代理配置,防火墙开放相应端口号
server {
listen 9001;
server_name 192.168.147.128;
location ~ /edu/ { 这里是正则匹配
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
4、启动nginx
location指令说明:
该指令用于匹配url
语法:
location [ = | ~ | ~* | ^~ ] url {
}
1、= : 用于不含正则表达式的url前,要求请求字符串与url严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~ :用于表示url包含正则表达式,并且区分大小写
3、~* :用于表示url包含正则表达式,并且不区分大小写
4、^~ :用于不含有正则表达式的url前,要求nginx服务器找到标识url和请求字符串匹配度最高的 location后,立即使用此location处理请求,而不再使用location块中的正则url和请求字符串做匹配。
注意:如果url包含正则表达式,则必须要有~或者~*标识。
4、nginx 配置实例之负载均衡
1、实现效果:
(1)、浏览器地址栏输入:http://192.168.147.128/edu/a.html,负载均衡效果,平均到8080和8081端口中去
2、准备工作:
(1)、准备两台tomcat服务器,一台8080,一台8081
(2)、在两台tomcat里面的webapps目录里面,创建名称是edu的文件夹,在edu文件夹中创建页面a.html,用于测试
3、在nginx的配置文件中进行负载均衡的配置
http {
upstream myserver {
server 192.168.147.128:8080;
server 192.168.147.128:8081;
}
server {
listen 80;
server_name server 192.168.147.128;
location / {
proxy_pass http://myserver;
}
}
}
4、nginx分配服务器策略:
第一种: 轮询 (默认):
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
第二种: weight
weight 代表权重,默认为1,权重越高被分配的客户端就越多。
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:
upstream myserver {
server 192.168.147.128:8080 weight=5;
server 192.168.147.128:8081 weight=10;
}
第三种: ip_hash,在里面直接加上ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题,例如:
upstream myserver {
ip_hash;
server 192.168.147.128:8080;
server 192.168.147.128:8081;
}
第四种: fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
server 192.168.147.128:8080;
server 192.168.147.128:8081;
fair;
}
5、nginx 配置实例之动静分离
1、动静分离:
nginx动静分离简单来说,就是把动态和静态请求分开,不能理解为只是单纯的将动态页面和静态页面物理分离,可以理解成使用nginx处理静态页面,tomcat处理动态页面。动静分离从目前的角度上来说大致分为两种:
一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
一种是动态和静态混合在一起发布,通过nginx来分开,通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
具体的expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可。所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用expires来缓存),比如这里设置3d,表示在3天之内访问这个url,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如有修改,则直接从服务器重新下载,返回状态码200.
2、准备工作:
(1)、 静态请求
在nginx里面建一个data文件夹,在data文件夹里面再建2个文件夹,分别为image和www,image里面存一张图片,www里面放一个a.html文件。
在nginx配置文件里面的server添加配置:
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on; 这个autoindex可以使最后在访问这个image文件夹时,可以列出文件里面资源的目录
expires: 3d; 也可以在这里加上过期时间
}
重启nginx服务器,在浏览器中输入 http://192.168.147.128/image/01.jpg就可以看到图片,输入http://192.168.147.128/www/a.html就可以看到页面。
6、nginx 配置高可用的集群(高并发)
主nginx宕机之后,自动切换到备用nginx,要起到高可用,需要使用keepalived这个软件
也就是需要:
1、需要两台 nginx服务器
2、两台虚拟机都需要keepalived
3、需要虚拟ip
1、准备工作:
主要是需要两个虚拟机,可以在vmware里面安装两个虚拟机,其它的操作是一样的
在服务器的usr文件夹里面安装keepalived: yum install keepalived -y
查看keepalived版本: rpm -q -a keepalived
2、安装之后,在etc里面会生成文件夹keepalived,里面有文件keepalived.conf配置文件
(1)、配置文件详解:
# 1、全局的配置
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.147.128
smtp_connect_timeout 30
router_id LVS_DEVELBACK #访问到主机,可以在sbin目录下使用命令:vi /etc/hosts查看LVS_DEVEL对应的域名,相当于LVS_DEVEL就是某域名的别名
}
# 2、脚本的配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" #检测的脚本配置
interval 2 #检测脚本执行的间隔,单位秒
weight -20 #权重,当条件满足,就将这个服务器的权重降低20
}
vrrp_instance VI_1 {
state BACKUP #显示服务器的状态,这里是备份服务器。主服务器上改为 MASTER
interface ens33 //网卡名称,输入ip addr可以查看网卡信息
virtual_router_id 51 #主、备机的virtual router id 必须相同
priorit 90 #主、备机取不同的优先级,主机值较大,备份机值较小,主机值一般取100
advert_int 1 #间隔多长时间来检测一下,当前服务器是不是还活着(正常工作),默认是1s
authentication { #表示权限校验的方式,用的是密码的方式,密码是1111
auth type PASS
auth_pass 1111
}
# 3、虚拟ip的配置
virtual_ipaddress {
192.168.147.50 //VRRP H虚拟ip地址
}
}
(2)、在/usr/local/src添加检测脚本(脚本文件):
#!/bin/bash
A=`ps -C nginx - no-header |wc -1`
if[$A -eq 0];then
/usr/local/nginx/sbin/nginx #nginx启动脚本的位置
sleep2
if[`ps -C nginx - no-header |wc -1` -eq 0];then #判断,如果nginx挂掉了,下面就杀掉所有的keepalived
killall keepalived
fi
fi
3、把两台服务器上的nginx和keepalived启动
启动nginx: ./nginx
启动keepalived: systemctl start keepalived.service
4、最终测试
(1)、首先在浏览器地址栏输入 虚拟ip :192.168.147.50,看是不是能正常访问
(2)、把主服务器(192.168.147.128)nginx和keepalived停掉,再输入 192.168.147.50,还是能正常访问
停止keepalived: systemctl stop keepalived.service
7、nginx 原理(怎么执行的、有什么结构、结构之间的关系)
1、master和worker之间的关系:
2、worker如何工作的?
3、一个master和多个worker有什么好处?
(1)对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
(2)采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则会很快启动新的worker进程。
当然,worker进程的异常退出,肯定是程序有bug了,异常退出会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
(3)可以使用 ./nginx -s reload 热部署,多个worker利于热部署操作。
4、需要设置多少个worker?
nginx同redis类似,都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不再话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker的数量和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设置多了会造成cpu频繁切换上下文带来的损耗。
5、worker的连接数 worker_connection:
这个值是表示每个worker进程所能简历连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections*worker_processes。当然,这里所说的最大连接数,对于HTTP请求本地资源来说,是这样。如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是worker_connections*worker_processes/2,而如果是HTTP作为反向代理来说,最大的并发数量应该是worker_connections*worker_processes/4,。因为作为反向代理的服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
版权声明:本文为congboer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。