一、Nginx简介

1.1 Nginx概述

systemctl restart nginx : 重启Nginx

**Nginx(enginx x)**是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强。

Nginx可以作为静态页面的 web服务器,还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 Java。Java 程序只能通过与 tomcat 配合完成。

Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,能支持高达 50000个并发连接数。

1.2 正向代理

Nginx不仅可以作为反向代理,实现负载均衡。还能用作正向代理来进行上网的功能。

正向代理

如果把局域网外的 Intent 想象成一个资源库,则局域网中的客户端要访问 Intent,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

正向代理需要客户端主动配置代理服务器。

QQ截图20220119114353.png

1.3 反向代理

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

QQ截图20220119115000.png

1.4 负载均衡

当并发请求比较高时,单个服务器解决不了,就需要增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,就是 **负载均衡**

QQ截图20220119115444.png

1.5 动静分离

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

QQ截图20220119115612.png

二、Nginx安装

开始安装

Nginx官网:http://nginx.org/

1.安装 nginx 需要依赖的环境

  1. yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

2.上传 nginx 压缩到到 Linux 中 (这里上传到 /opt 目录下)

3.解压缩 nginx 压缩包

  1. tar -zxvf nginx-1.12.2.tar.gz

4.进入解压缩目录,执行下述命令

  1. ./configure

5.编译并安装

  1. make && make install

最终,nginx 会被安装到 /usr/local/nginx 目录下。

查看端口号

  1. firewall-cmd --list-all

设置端口号

  1. firewall-cmd --add-service=http --permanent
  2. sudo firewall-cmd --add-port=80/tcp --permanent

重启防火墙

  1. firewall-cmd --reload

当然如果执行防火墙命令失败,可执行下述命令进行安装:

  1. yum install firewalld
  2. systemctl start firewalld
  3. systemctl status firewalld

出现 active (running) 绿字样式表示安装成功,可继续上述命令设置端口号。

80端口号被设置成功

QQ截图20220119122047.png

三、Nginx常用命令与配置文件

3.1 常用命令

注意:使用 nginx 命令需要进入到 /usr/local/nginx/sbin 目录下才能执行命令成功。

启动 nginx ./nginx
关闭 nginx ./nginx -s stop
重新加载 ./nginx -s reload

访问 Nginx 首页

在我们输入./nginx 命令后,Nginx 就已经启动了,这个时候我们在浏览器中访问http://ip:80就可以访问到 nginx 首页:QQ截图20220119134446.png

3.2 nginx 配置文件

Nginx 配置文件位置在:/usr/local/nginx/conf/nginx.conf

nginx.conf 配置文件内容如下(已经去掉注释部分),可以看出 nginx.conf 配置文件主要为 3 个部分:

  1. # 第一部分:全局块 -- 从配置文件开始到 events 块之间的内容
  2. # 主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器
  3. # 的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径
  4. # 和类型以及配置文件的引入等。
  5. # 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发
  6. # 处理量也越多,但是会受到硬件和软件设备的制约
  7. worker_processes 1;
  8. # 第二部分:events 块
  9. # events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启
  10. # 对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取
  11. # 哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
  12. # 这部分的配置对 Nginx 的性能影响较大,实际中应该灵活配置。
  13. events {
  14. # 表示每个 work process 支持的最大连接数为 1024
  15. worker_connections 1024;
  16. }
  17. # 第三部分:http 块
  18. # 配置最频繁的部分,代理、缓存、日志定义等大部分功能和第三方模块的配置都在这里。
  19. # 其中,http 块也可以包括 http 全局块、server 块。
  20. http {
  21. # http 全局块
  22. # http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、
  23. # 单链接请求数上限等
  24. include mime.types;
  25. default_type application/octet-stream;
  26. sendfile on;
  27. keepalive_timeout 65;
  28. # server 块
  29. # 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全
  30. # 一样的,该技术的产生时为了节省互联网服务器硬件成本。
  31. # 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
  32. # 每个 server 块也分为全局 server 块以及可以同时包含多个 location 块。
  33. server {
  34. # 全局 server 块
  35. # 最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或 IP 配置
  36. listen 80;
  37. server_name localhost;
  38. # location 块
  39. # 一个 server 块可以配置多个 location 块。
  40. # 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如:server_name/uri-string),
  41. # 对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的 /uri-string)进行匹配,
  42. # 对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有需要第三方模块的
  43. # 配置也在这里进行。
  44. location / {
  45. root html;
  46. index index.html index.htm;
  47. }
  48. error_page 500 502 503 504 /50x.html;
  49. location = /50x.html {
  50. root html;
  51. }
  52. }
  53. }

四、Nginx配置实例1:反向代理

4.1 反向代理实例1

实现效果:打开浏览器,在浏览器地址栏输入地址:www.123.com,跳转到 Linux 系统的tomcat主页面中。

准备工作1:安装jdk环境

  1. # 在线安装 jdk 环境
  2. yum install -y java-1.8.0-openjdk-devel.x86_64
  3. # 查看 jdk 版本,有正确返回则安装成功
  4. java -version

准备工作2:安装tomcat

  1. # 上传 tomcat 压缩到到 /opt 目录下
  2. # 解压安装包
  3. tar -zxvf apache-tomcat-7.0.70.tar.gz
  4. # 进入到 bin 目录下
  5. cd /apache-tomcat-7.0.70/bin
  6. # 启动 tomcat 服务器,这里已经启动成功,可不进行后续操作
  7. ./startup.sh
  8. # 进入到日志文件夹
  9. cd ..
  10. cd log/
  11. # 查看 tomcat 启动日志
  12. tail -f catalina.out

准备工作3:开始tomcat默认端口号8080:由于 Linux 默认不开放很多端口,所以需要我们手动配置。

  1. # 开启8080端口号
  2. sudo firewall-cmd --add-port=8080/tcp --permanent
  3. # 重启防火墙
  4. firewall-cmd --reload
  5. # 查看开放的端口号
  6. firewall-cmd --list-all

测试:查看 tomcat 服务器首页

在浏览器中输入服务器ip地址:8080访问tomcat首页,成功展示则准备工作完成。

下面正式开始配置与nginx相关的内容:

步骤1:修改 hosts 文件

C:\Windows\System32\drivers\etc\hosts中添加如下内容:

  1. 124.223.64.141 www.123.com

QQ截图20220119161947.png
这样就可以通过www.123.com来访问到nginx首页内容。
注意:这里没有测试通过,出现下面页面,不知道是什么原因。
QQ截图20220119162211.png

步骤2:修改nginx配置文件

  1. # 打开 nginx 配置文件
  2. vim /usr/local/nginx/conf/nginx.conf

按照图示修改:
QQ截图20220119162448.png
server_name:指向服务器 ip 地址。
proxy_pass:指向本机(与nginx服务器是同一个网段,所以使用127.0.0.1),端口号 8080 是指向 tomcat 端口号。

步骤3:重启 nginx 或者重新加载配置文件

  1. # 在 nginx/sbin 目录下
  2. # 重启
  3. ./nginx -s stop
  4. ./nginx
  5. # 重新加载
  6. ./nginx -s reload

步骤4:测试

如果第一步通过可直接访问www.123.com访问到tomcat服务器首页;
如果第一步没有通过,可以访问:配置的ip(124.223.64.141)访问到tomcat服务器首页。
QQ截图20220119163421.png

4.2 反向代理实例2

实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听的端口为9001

  • 访问http://127.0.0.1:9001/mp3/直接跳转到127.0.0.1:8081
  • 访问http://127.0.0.1:9001/mp4/直接跳转到127.0.0.1:8082

步骤1:

  • 添加端口号:800180029001,并重启防火墙。
  • /opt目录下使用mkdir命令创建两个文件夹:tomcat8001tomcat8002
  • 分别将tomcat包上传到2个文件夹中。
  • 在当前目录解压2个安装包。
  • 使用vim修改tomcat解压包中server.xml端口号。
  • 分别启动2个tomcat
  • 测试访问2个tomcat是否能够正常访问。
  • 在端口号为8001tomcat中的webapps下创建mp3目录,放入index.html文件,文件内容为音频文件
  • 在端口号为8002tomcat中的webapps下创建mp4目录,放入index.html文件,文件内容为视频文件
  • 再次测试访问2个地址,访问成功则准备工作完成。

QQ截图20220119174654.png
QQ截图20220119174704.png

步骤2:配置nginx

  1. # 在 http{} 中另起一个 server{} 块
  2. server {
  3. listen 9001; # 监听端口号9001
  4. server_name 124.223.64.141; # 服务器ip地址
  5. location ~ /mp3/ { # 转发,连接中含有mp3的内容
  6. proxy_pass http://127.0.0.1:8001;
  7. }
  8. location ~ /mp4/ { # 转发,连接中含有mp4的内容
  9. proxy_pass http://127.0.0.1:8002;
  10. }
  11. }

测试地址124.223.64.141:9001/mp3
QQ截图20220119175747.png

测试地址124.223.64.141:9001/mp4/hello.html
QQ截图20220119174704.png
上面两张图表示测试成功。

4.3 location指令说明

location指令用于匹配URL。

语法如下:

  1. location [ = | ~ | ~* | ^~] uri {
  2. }

释义:
1、= : 用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~ : 用于表示 uri 包含正则表达式,并且区分大小写。
3、~ : 用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~ : 用于不含正则表达式的 uri 前,要求 nginx 服务器找到标识 uri 和请求字符串匹配度最高的
location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字
符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~
标识。

五、Nginx配置实例2:负载均衡

5.1 负载均衡配置

准备工作

  • 准备2个tomcat服务器,在它们的webapps目录下创建目录load文件夹,创建文件a.html
  • 其中端口号为8001的服务器a.html内容为8001,端口号为8002的服务器a.html内容为8002
  • 测试可成功访问2个页面。

配置 nginx

  1. http{
  2. ......
  3. # 配置负载均衡
  4. upstream myserver {
  5. server 127.0.0.1:8001;
  6. server 127.0.0.1:8002;
  7. }
  8. server {
  9. listen 80; # 监听端口号80
  10. server_name 124.223.64.141; # 服务器地址
  11. location / {
  12. root html;
  13. proxy_pass http://myserver; # 配置转发地址
  14. index index.html index.htm;
  15. }
  16. ......
  17. }

测试

重启nginx后,在浏览器中输入 [http://124.223.64.141/load/a.html](http://124.223.64.141/load/a.html)测试是否成功,多次刷新会发现页面会在80018002之间轮换展示。

5.2 负载均衡分配策略

上面测试后会发现,页面内容会在80018002中不停展示,这是一种默认的分配策略,Nginx共有以下几种分配策略:

5.2.1 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。这是一种默认的分配方式。

  1. upstream myserver {
  2. server 127.0.0.1:8001;
  3. server 127.0.0.1:8002;
  4. }

5.2.2 权重(weight)

weigth代表权重,默认为1,权重越高被分配的客户端越多。weight访问比率成正比,用于后端服务器性能不均的情况。

  1. upstream myserver {
  2. server 127.0.0.1:8001 weight = 5;
  3. server 127.0.0.1:8002 weight = 10;
  4. }

5.2.3 ip_hash

每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

  1. upstream myserver {
  2. ip_hash;
  3. server 127.0.0.1:8001;
  4. server 127.0.0.1:8002;
  5. }

5.2.4 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  1. upstream myserver {
  2. server 127.0.0.1:8001;
  3. server 127.0.0.1:8002;
  4. fair;
  5. }

六、Nginx配置实例3:动静分离

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。

动静分离大致分为两类:

  • 纯粹把静态文件独立成单独的域名,放在独立的服务器上,主流的方案。
  • 动态和静态文件混合在一起发布,通过nginx来分开。

动静分离的处理方案如下:

  • 通过location指定不同的后缀名实现不同的请求转发。
  • 通过expired参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。

Expires定义

  • 给一个资源设定过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。
  • 这种方式适合不经常变动的资源,如果经常更新的文件,不建议使用Expires来缓存。
  • 如果设置3d,表示 3 天之内访问这个 URL,发送一个请求,对比服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304;如果有修改,则直接从服务器重新下载,返回状态码200

准备工作

  • Linux根目录创建static文件夹。
  • static文件夹中创建htmlimage文件夹。
  • html文件夹中创建1.html文件;在image文件夹中传入1.jpg图片。

nginx配置

  1. server {
  2. # 监听80端口号
  3. listen 80;
  4. # 服务器ip地址
  5. server_name 124.223.64.141;
  6. # 监听 /static/image/
  7. location /image/ {
  8. root /static/;
  9. # 开启目录浏览功能,请求目录时,会显示目录下的文件列表
  10. autoindex on;
  11. # 设置过期时间1天
  12. expires 1d;
  13. }
  14. }

验证

重启nginx后,分别验证http://124.223.64.141/html/1.htmlhttp://124.233.64.141/1.jpg链接,成功则表示配置成功。

七、Nginx配置实例4:高可用

下图展示了高可用的Nginx配置实例。当只有一台Nginx服务器时,当该Nginx服务器宕机了,那么后续整个网络就断掉了,因此我们需要准备2台Nginx服务器,当主Nginx服务器宕机之后,切换到从Nginx服务器,这样整个网络不会有影响。
为了达到这一个目的,必须准备一个虚拟ip作为客户端访问的唯一入口,让该虚拟ip来决定是访问主服务器还是从服务器,因此我们需要在Linux环境中安装keepalived软件,来检测主Nginx服务器是否存活,如果已经宕机则切换到从Nginx服务器上。

Nginx - 图15

准备工作

  • 需要两台服务器:192.168.10.100192.168.10.200
  • 在两台服务器上安装nginx
  • 在两台服务器上安装keepalived。 ```nginx

    安装 keepalived 软件

    yum install keepalived -y

查看是否安装成功

rpm -q -a keepalived

启动 keepalived

systemctl start keepalived.service

停止 keepalived

systemctl stop keepalived.service

keepalived会被安装到 /etc 目录下

  1. > 查看网卡:ifconfig命令
  2. ![QQ截图20220120121542.png](https://cdn.nlark.com/yuque/0/2022/png/25931804/1642652153651-a169d7f3-e051-48c8-9222-2bc93dc675c3.png#clientId=uc8af35bd-f677-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=ud7e1d0bd&margin=%5Bobject%20Object%5D&name=QQ%E6%88%AA%E5%9B%BE20220120121542.png&originHeight=288&originWidth=550&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26016&status=done&style=none&taskId=u55026054-cf61-4dac-9a41-c6b08c143a3&title=)<br />上面`eth0`就是网卡,后面配置会需要到。
  3. > 配置 keepalived.conf
  4. `keepalived.conf`文件位于`/etc/keepalived`目录下,配置高可用我们只需要配置该文件即可,配置内容如下:
  5. ```nginx
  6. # 全局定义
  7. global_defs {
  8. notification_email {
  9. acassen@firewall.loc
  10. failover@firewall.loc
  11. sysadmin@firewall.loc
  12. }
  13. notification_email_from Alexandre.Cassen@firewall.loc
  14. # 这里是我们主、从服务器的ip地址
  15. smtp_server 192.168.17.129
  16. smtp_connect_timeout 30
  17. # 路由id:主要是这个值,唯一的值,也可以写ip
  18. router_id LVS_DEVEL
  19. # 设置运行脚本默认用户和组。如果没有指定,则默认用户为keepalived_script(需要该用户存在)
  20. # 否则为root用户,默认groupname
  21. script_user root
  22. # 如果脚本路径的任一部分对于非root用户来说,都具有可写权限,则不会以root身份运行脚本
  23. enable_script_security
  24. }
  25. # 检测Nginx是否还存活的脚本
  26. vrrp_script chk_http_port {
  27. # 脚本的位置,需要在该有同名的脚本文件
  28. script "/usr/local/src/nginx_check.sh"
  29. #(检测脚本执行的间隔)
  30. interval 2
  31. # 设置当服务器的权重
  32. weight 2
  33. }
  34. # 虚拟ip的配置
  35. vrrp_instance VI_1 {
  36. # 备份服务器上将 MASTER 改为 BACKUP
  37. # 如果这是主服务器就改为 MASTER
  38. # 如果这是从服务器就改为 BACKUP
  39. state BACKUP
  40. # 这是系统的网卡,通过ifconfig获取
  41. interface eth0
  42. # 主、备机的 virtual_router_id 必须相同
  43. virtual_router_id 51
  44. # 主、备机取不同的优先级,主机值较大,备份机值较小
  45. priority 90
  46. # 每个多久发送一次心跳,1:1秒
  47. advert_int 1
  48. # 权限校验
  49. authentication {
  50. auth_type PASS
  51. auth_pass 1111
  52. }
  53. # 虚拟IP地址
  54. virtual_ipaddress {
  55. # 这里配置的就是我们的虚拟ip地址
  56. # 主从服务器配置的虚拟ip要一致
  57. 192.168.17.50
  58. }
  59. # 指定监控脚本
  60. track_script {
  61. # 这里的chk_http_port对应上面的vrrp_script的名字
  62. chk_http_port
  63. }
  64. }

上述配置文件中,我们在主从配置中只需要修改以下几个参数即可:

  • smtp_server:服务器地址;
  • router_id:唯一的值,两个配置可用相同;
  • state:主服务器配置MASTER,从服务器配置 BACKUP
  • interface:分别配置主、从服务器上的网卡;
  • priority:主服务器上的值比从服务器上的值要大才行;

配置检测脚本文件

keepalived.conf配置文件中,我们定义了脚本文件的位置以及文件名字:/usr/local/src/nginx_check.sh,因此我们需要在该目录下配置该文件,两个服务器的脚本文件相同,文件内容如下:

  1. #!/bin/bash
  2. A=`ps -C nginx –-no-header |wc -l`
  3. if [ $A -eq 0 ];then
  4. /usr/local/nginx/sbin/nginx # 这里地址指向 nginx 的启动位置
  5. sleep 2
  6. if [ $A -eq 0 ];then
  7. systemctl stop keepalived
  8. fi
  9. fi

这里还需要给脚本文件添加权限,否则无法启动:

  1. chmod 744 /usr/local/src/nginx_check.sh

临时关闭selinux

  1. setenforce 0

总结配置步骤:

  • 准备两台服务器A服务器B
  • 分别为两台服务器安装nginx
  • 分别为两台服务器安装keepalived
  • 在服务器A中修改keepalived.conf文件内容,服务器地址指向服务器A的地址。
  • 在服务器A中添加检测脚本。
  • 启动服务器A中的nginxkeepalived
  • 在服务器B中修改keepalived.conf文件内容,服务器地址指向服务器B的地址。
  • 在服务器B中添加检测脚本。
  • 启动服务器B中的nginxkeepalived
  • 通过服务器A的ip能访问到服务器A上的Nginx首页。
  • 通过服务器B的ip能访问到服务器B上的Nginx首页。

上述执行完毕之后,我们就可以开始最终测试,测试步骤如下:

最终测试步骤:

  • 通过虚拟ip访问到Nginx首页。
  • 停止服务器A的nginx和keepalived。
  • 再次通过虚拟ip访问到Nginx首页。

可以通过ip a 的命令查看绑定结果:
QQ截图20220120125304.png
注意:通过虚拟ip访问没有测试通过。

八、Nginx原理解析

九、排错


Nginx重启失败

Nginx重启失败,提示以下错误:

  1. nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

解决方案如下:

步骤1:

打开nginx.conflog注释,如下图:
QQ截图20220119193930.png

步骤2:

执行下述命令:

  1. sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf