安装包

nginx-1.18.0.tar.gz

基本概念

什么是 nginx

  1. Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负
  2. 载的考验,有报告表明能支持高达 50,000 个并发连接数。

正向代理

image.png

  1. Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
  2. 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访
  3. Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

反向代理

image.png

  1. 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只
  2. 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返
  3. 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器
  4. 地址,隐藏了真实服务器 IP 地址。

负载均衡

  1. 增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的
  2. 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

动静分离

image.png

  1. 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速
  2. 度。降低原来单个服务器的压力。

Nginx安装到Windows

  1. 官网:http://nginx.org 下载并解压
  2. 启动:打开cmd窗口,依次输入命令如下命令启动
  3. cd nginx目录路径
  4. e:
  5. start nginx
  6. 会有黑窗口一闪而过,这不是失败,是启动成功了。
  7. 访问:http://127.0.0.1:80
  8. 为何是访问80端口?为何会显示上述页面?
  9. conf目录下有一个 nginx.conf 文件,用编辑器打开

FvxAzlwjyq9DHXaed3zXLIR0ArPV.jpg

image.png

Nginx安装到linux

  1. 官网:http://nginx.org
  2. 安装 openssl zlib gcc 依赖(上面的也可以一起装,记录多种安装方式)
  3. yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
  4. 安装 pcre
  5. wget http://downloads.sourceforge.net/project/pcre/pcre/8.43/pcre-8.43.tar.gz
  6. 下载后解压:tar -xvf pcre-8.43.tar.gz。然后进入该目录
  7. 输入命令:./configure(默认,不加任何参数)
  8. 输入命令:make && make install
  9. 安装后可查看其版本:pcre-config --version
  10. 安装 nginx
  11. 上传下载的nginx,然后解压并进入目录。
  12. 输入命令:./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/logs/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --with-http_stub_status_module --with-http_gzip_static_module --with-stream
  13. 输入命令:make && make install
  14. 安装成功后,会在usr文件夹下多出一个local/nginx,在nginxsbin有启动脚本。
  15. 进入目录:cd /usr/local/nginx/sbin
  16. 启动服务:./nginx
  17. 启动后查看:ps -ef | grep nginx
  18. 如果发现端口冲突,先查看端口占用,然后kill掉进程:netstat -ntlp
  19. 访问页面(默认80端口):http://127.0.0.1:80
  20. linux默认有防火墙,默认是访问不到的,需要端口号设置:
  21. 查看开放的端口号:firewall-cmd --list-all
  22. 设置开放的端口号:
  23. 请求开放(http/tcp等):firewall-cmd --add-service=http permanent
  24. 端口开放:firewall-cmd --add-port=80/tcp --permanent
  25. 重启防火墙:firewall-cmd reload
  26. nginx卸载(删除即可)
  27. 查找:find / -name nginx*
  28. 删除:rm -rf /usr/local/nginx*

遇到问题

nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

  1. 查看原因,输入命令:
  2. ldd $(which /usr/local/nginx/sbin/nginx)

image.png

  1. 建立软链接,输入命令:
  2. ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1

Nginx常用命令

  1. 使用操作命令的前提条件,就是要先进入到nginx目录
  2. cd /usr/local/nginx/sbin
命令 说明
nginx -t 验证配置是否正确
nginx -v 查看Nginx的版本号
start nginx 启动Nginx
nginx -s stop 快速停止或关闭Nginx
nginx -s quit 正常停止或关闭Nginx
nginx -s reload 配置文件修改重加载命令
nginx -s reopen 重新打开日志文件

Nginx配置文件

image.png

  1. 配置文件路径:/usr/local/nginx/conf/nginx.conf
  2. 配置文件大部分都是#注释的,不注释的包含三部分内容:
  3. 1.全局块:配置服务器整体运行的配置指令
  4. 比如 worker_processes 1:这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,
  5. 可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约
  6. 2.events块:影响 Nginx 服务器与用户的网络连接
  7. 比如 worker_connections 1024; 支持的最大连接数为 1024
  8. 3.http块:这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和
  9. 第三方模块的配置都在这里。
  10. http块还包含两部分: http 全局块 server
  11. (1)http 全局块
  12. http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
  13. (2)server
  14. 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了
  15. 节省互联网服务器硬件成本。
  16. 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
  17. 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
  18. 1、全局 server
  19. 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
  20. 2location
  21. 一个 server 块可以配置多个 location 块。
  22. 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),
  23. 对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,
  24. 对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

Nginx配置实例-反向代理1

  1. 实现效果:
  2. 打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到liunx系统tomcat主页面中。
  3. 准备工作
  4. 1、安装一个tomcat
  5. liunx系统安装tomcat,使用默认端口8080
  6. tomcat安装文件放到liunx系统中,解压
  7. 进入tomcatbin目录中,./startup.sh 启动tomcat服务器
  8. 2、对外开放访问的端口
  9. firewall-cmd --add-port=8080/tcp --permanent
  10. firewall-cmd reload
  11. 查看已经开放的端口号
  12. firewall-cmd --list-all
  13. 开始配置
  14. 1、在windows系统的hosts文件进行域名和ip对应关系的配置,
  15. 加入如下配置映射。因为没域名,不映射就跳转到其他页面了,所以需要改一下hosts文件。
  16. 192.144.172.62 www.nginx.com
  17. 2、在nginx进行请求转发的配置(反向代理配置)
  18. server块中进行修改
  19. server {
  20. listen 80;
  21. # 将server_name改为IP
  22. server_name 192.144.172.62;
  23. location / {
  24. root html;
  25. # 加上proxy_pass,代表请求后会跳转本机的8080端口的路径上
  26. proxy_pass http://127.0.0.1:8080;
  27. index index.html index.htm;
  28. }
  29. }
  30. 如上配置,监听80端口,访问域名为 www.nginx.com,不加端口号时默认为80端口,
  31. 故访问该域名时会跳转到127.0.0.1:8080路径上。
  32. 测试:
  33. 进入目录,执行重加载配置文件命令。
  34. cd /usr/local/nginx/sbin
  35. 执行:./nginx -s reload

Nginx配置实例-反向代理2

  1. 实现效果:
  2. 使用nginx反向代理,根据访问的路径跳转到不同端口的服务中。nginx监听端口为9001
  3. 访问http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
  4. 访问http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082
  5. 准备工作
  6. 准备两个tomcat,一个8001端口,一个8002端口,并准备好测试的页面。
  7. 开放端口步骤参考上面的说明。
  8. 开始配置
  9. 修改nginx的配置文件,在http块中添加server{}
  10. server {
  11. # 监听9091端口
  12. listen 9091;
  13. server_name 192.144.172.62;
  14. location ~ /edu/ {
  15. proxy_pass http://localhost:8001;
  16. }
  17. location ~ /vod/ {
  18. proxy_pass http://localhost:8002;
  19. }
  20. }
  21. location指令说明:该指令用于匹配 URL。语法如下:
  22. location [ = | ~ | ~* | ^~ ] uri {}
  23. 1、= :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  24. 2、~ :用于表示uri包含正则表达式,并且区分大小写。
  25. 3、~*:用于表示uri包含正则表达式,并且不区分大小写。
  26. 4、^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,
  27. 立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
  28. 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

Nginx配置实例-负载均衡

  1. 实现效果
  2. 浏览器地址栏输入地址http://192.144.172.62/edu/a.html,负载均衡效果,平均分配到8080和8081端口中去。
  3. 准备工作上面已经做好了,开始配置
  4. nginx的配置文件中进行负载均衡的配置
  5. http{
  6. upstream myserver{
  7. ip_hash;
  8. server 192.144.172.62:8080;
  9. server 192.144.172.62:8081;
  10. }
  11. server {
  12. listen 80;
  13. server_name 192.144.172.62;
  14. location / {
  15. proxy_pass http://myserver;
  16. root html;
  17. index index.html index.htm;
  18. }
  19. }
  20. }

Nginx常用负载均衡分配服务器策略

  1. 1、轮询(默认使用)
  2. 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  3. 2weight权重
  4. weight代表权重,默认为1,权重越高被分配的客户端越多。
  5. 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。比如:
  6. upstream server_pool{
  7. server 192.168.5.21 weight=10;
  8. server 192.168.5.22 weight=9;
  9. }
  10. 3ip_hash
  11. 每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:
  12. upstream server_pool{
  13. ip_hash;
  14. server 192.168.5.21:80;
  15. server 192.168.5.22:80;
  16. }
  17. 4fair(第三方)
  18. 按后端服务器的响应时间来分配请求,响应时间短的优先分配。比如:
  19. upstream server_pool{
  20. server 192.168.5.21:80;
  21. server 192.168.5.22:80;
  22. fair;
  23. }
  24. 如果是tcp的链接,比如mongodbtcp链接的:
  25. server {
  26. listen 120.87.157.166:27017; # 这里是对外的访问IP和端口
  27. #server_name 120.27.157.166;
  28. proxy_connect_timeout 1s; # 指tcp 握手的超时时间
  29. proxy_timeout 3s; # 指在这段时间内如果没有数据传输那就触发timeout,所以这里可以时间设长一点:10s
  30. proxy_pass mongo; # 这里是代理的IP,可以写多个
  31. }
  32. 比如像这样:
  33. upstream mongo{
  34. server 192.168.5.21:27017;
  35. server 192.168.5.22:27017;
  36. }
  37. 使用fair需要安装负载均衡模块nginx-upstream-fair
  38. 配置:
  39. ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --add-module=/home/nginx-upstream-fair-master
  40. 编译:
  41. make
  42. 复制Nginx
  43. cp objs/nginx /usr/local/nginx/nginx
  44. 配置:按照第4个方法加上fair配置。
  45. 注意:
  46. 已安装Nginx,配置第三方模块时,只需要--add-module=/第三方模块目录,然后make编译一下就可以,
  47. 不要make install安装。编译后复制objs下面的Nginx到指定目录下。

Nginx配置实例-动静分离

image.png

  1. Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。
  2. 严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。
  3. 动静分离从目前实现角度来讲大致分为两种:
  4. 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
  5. 另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx来分开。
  6. 通过location指定不同的后缀名实现不同的请求转发。通过expires(过期)参数设置,可以使浏览器缓存过期时间,
  7. 减少与服务器之前的请求和流量。具体Expires定义:
  8. 是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
  9. 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。
  10. (如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL
  11. 发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304
  12. 如果有修改,则直接从服务器重新下载,返回状态码200
  13. 准备工作
  14. liunx系统中准备静态资源,用于进行访问
  15. 比如图片、jscss、静态页面等等。这里假设在linux的/data目录下有一个image(图片)目录和www(静态页面)目录
  16. 开始配置
  17. 找到 nginx 安装目录,打开/conf/nginx.conf 配置文件
  18. server {
  19. listen 80;
  20. server_name 192.144.172.62;
  21. location /www/ {
  22. root /data/;
  23. index index.html index.htm;
  24. }
  25. location /image/ {
  26. root /data/;
  27. # 列出目录。有时候一个nginx服务就是为了用来下载文件的,加上这个参数,就展示文件的目录了。
  28. autoindex on;
  29. }
  30. }
  31. 重点是添加location
  32. 最后检查Nginx配置是否正确即可,然后测试动静分离是否成功,只需要删除后端tomcat服务器上的某个静态文件,
  33. 查看是否能访问,如果可以访问说明静态资源Nginx直接返回了,不走后端tomcat服务器。

Nginx+Keepalived高可用集群(主从模式)

image.png

  1. 1)需要两台 nginx 服务器
  2. 2)需要 keepalived
  3. 3)需要虚拟 ip
  4. 配置高可用的准备工作
  5. 1)需要两台服务器 192.168.17.129 192.168.17.131
  6. 2)在两台服务器安装 nginx
  7. 3)在两台服务器安装 keepalived
  8. 在两台服务器安装 keepalived
  9. 1)使用 yum 命令进行安装
  10. yum install keepalived y
  11. 查看是否安装:rpm -q -a keepalived
  12. 2)安装之后,在 etc 里面生成目录keepalived,有文件keepalived.conf
  13. Keepalived高可用软件
  14. keepalived软件主要是通过VRRP协议实现高可用功能的。
  15. VRRPVirtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,
  16. VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。
  17. Keepalived原理
  18. Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,
  19. Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。
  20. 当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。
  21. 于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,
  22. 备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。
  23. 启动之后会有三个进程,没问题之后可以关闭keepalived软件,接下来要修改keepalived的配置文件。
  24. vim /etc/keepalived/keepalived.conf #用vim打开编辑
  25. 开始高可用配置(主从配置)
  26. 1)修改/etc/keepalived/keepalivec.conf 配置文件
  27. # 全局配置
  28. global_defs {
  29. notification_email {
  30. acassen@firewall.loc
  31. failover@firewall.loc
  32. sysadmin@firewall.loc
  33. }
  34. notification_email_from Alexandre.Cassen@firewall.loc
  35. smtp_server 192.168.17.129
  36. smtp_connect_timeout 30
  37. # 这里写服务器名称,hosts文件的IP映射。路由标识,在一个局域网里面应该是唯一的
  38. router_id LVS_DEVEL # hosts文件 127.0.0.1 LVS_DEVEL
  39. }
  40. vrrp_script chk_http_port {
  41. # 脚本文件路径
  42. script "/usr/local/src/nginx_check.sh"
  43. interval 2 #(检测脚本执行的间隔,2代表2秒)
  44. weight 2 # 代表权重,脚本执行成功,将当前服务器权重设置为2
  45. }
  46. vrrp_instance VI_1{...}这是一个VRRP实例,里面定义了keepalived的主备状态、接口、优先级、认证和IP信息;
  47. vrrp_instance VI_1 {
  48. state BACKUP # VRRP的角色 主:MASTER 备:BACKUP
  49. interface ens33 # 网卡名称 linux查看网卡名称:ifconfig。根据实际来填写
  50. virtual_router_id 51 # 虚拟路由ID标识。主、备机的 virtual_router_id 必须相同
  51. priority 90 # 主、备机取不同的优先级,优先级,数字越大,优先级越大。一般主较大,备较小
  52. # nopreempt #不抢占资源
  53. advert_int 1 # 时间间隔,发送心跳,默认1秒
  54. authentication { # 权限,密码1111。两台机器密码一致
  55. auth_type PASS
  56. auth_pass 1111
  57. }
  58. # virtual_ipaddress {...}定义虚拟IP地址,可以配置多个IP地址,这里我定义为192.168.17.50
  59. virtual_ipaddress {
  60. 192.168.17.50 # VRRP H 虚拟地址,此处绑定虚拟IP,可以绑定多个。这也是对外的访问IP
  61. }
  62. }
  63. 修改好主节点之后,保存退出,然后启动keepalived,几分钟内会生成一个虚拟IP192.168.17.50
  64. 查看命令:ip addr
  65. 然后修改备节点的配置文件,修改好后保存退出后启动keepalived,此时备节点不会生成虚拟IP
  66. 如果生成那就是配置文件出现了错误。备节点和主节点争用IP资源,这个现象叫做“裂脑”。
  67. 测试实验
  68. 停掉主节点的keepalived服务,查看备节点会不会生成VIP192.168.17.50
  69. 然后启动主节点的keepalived服务,然后查看主节点和备节点的VIP,主节点应该会抢夺回来VIP
  70. 2)在/usr/local/src 添加检测脚本 nginx_check.sh
  71. #!/bin/bash
  72. A=`ps -C nginx –no-header |wc -l`
  73. if [ $A -eq 0 ];then
  74. /usr/local/nginx/sbin/nginx # nginx的启动路径,它判断nginx是否还活着,能启动就启动,不能启动就切换到另外一个
  75. sleep 2
  76. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
  77. killall keepalived #如果nginx挂了,就把keepalived杀死
  78. fi
  79. fi
  80. 3)把两台服务器上 nginx keepalived 启动
  81. 启动 nginx:./nginx
  82. 启动 keepalivedsystemctl start keepalived.service
  83. 查看是否启动成功:ps -ef | grep keepalived
  84. 最终测试
  85. 1)在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50
  86. 2)把主服务器(192.168.17.129nginx keepalived 停止,再输入 192.168.17.50
  87. 先停止keepalivedsystemctl stop keepalived.service
  88. 再停止Nginx

Nginx原理及参数优化

image.png

  1. master-workers 的机制的好处
  2. 1)可以使用 nginx s reload 热部署,利用 nginx 进行热部署操作
  3. 2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,
  4. 继续进行争抢,实现请求过程,不会造成服务中断。
  5. 需要设置多少个worker?设置多少个woker合适?
  6. worker 数和服务器的 cpu 数相等是最为适宜的。
  7. 连接数 worker_connection
  8. 问题一:发送请求,占用了 woker 的几个连接数?
  9. 答案:2个或者4个。访问静态资源占用2个。访问静态资源并且还访问tomcat占用4个。
  10. 问题二:nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
  11. 1.普通的静态访问最大并发数是: worker_connections * worker_processes / 2
  12. 2.而如果是 HTTP 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4