简介

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪等。

特性

高性能

Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

代理方式

正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

nginx - 图1

正向代理会让服务端无法知道客户端,进而隐藏了用户端

反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

nginx - 图2

反向代理和负载均衡会让请求自动发送给真正的服务器,让客户端无法知道访问的真正服务器的IP和端口号,进而隐藏了服务器,也保证了安全和效率。反向代理便是Nginx特性。

负载均衡

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行

在高并发的时候,可以增强服务器配置,但也无法应对一些高并发需求,因此可以增加服务器数量来应对高并发,负载均衡可以收集我们的请求,将请求分发到增加的不同的服务器上。

nginx - 图3

动静分离

动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

在web网站中,可以将静态资源部署到一台服务器,动态资源部署到一台服务器,分开2种访问请求,可以加快网站访问速度。

nginx - 图4

Nginx安装

nginx需要安装的第三方包:

  • gcc 编译器:编译需要使用。
    yum install gcc -y
  • PCRE:nginx 的 http 模块使用 pcre 来解析正则表达式。
    yum install pcre pcre-devel -y
  • zlib:nginx 使用 zlib 对 http 包的内容进行 gzip。
    yum install -y zlib zlib-devel
  • OpenSSL:nginx支持https协议,可以使用这个包来进行安全通信。
    yum install pcre pcre-devel -y

可以使用 yum list [包名] | grep [包名] 检查是否安装

安装nginx

  • 官网下载压缩包并上传到linux
    使用Xftp上传到 /usr/local 目录
    nginx - 图5
  • 解压
    tar -xvf nginx-1.20.2.tar
  • 解压后进入该目录
    cd nginx-1.20.2/
    检查配置
    ./configure
  • 编译并安装
    make && make install
  • 安装成功后在local目录下会生成nginx目录
    nginx - 图6

Nginx常用命令

执行nginx命令需要进入到nginx的sbin目录执行

cd /usr/local/nginx/sbin

查看Nginx版本号

  • ./nginx -v
    nginx - 图7

Nginx开启

  • 进入nginx的sbin目录执行
    ./nginx 开启nginx
  • 查看进程
    ps -ef | grep ngnix
    nginx - 图8
  • 此时配置文件 .conf 中nginx默认监听80端口
    打开浏览器访问linux的IP地址出现
    nginx - 图9
    即表示开启成功。
  • 失败原因:防火墙未开放80端口
    • 查看开放的端口号
      firewall-cmd --list-all ,此时未开放80端口
      nginx - 图10
    • 开放80端口
      sudo firewall-cmd --add-port=80/tcp --permanent
      关闭80端口
      firewall-cmd --permanent --remove-port=80/tcp
    • 重启防火墙
      firewall-cmd --reload
    • 再次查看防火墙状态
      nginx - 图11
      80端口已开启
    • 或者可以直接关闭防火墙
      systemctl stop firewalld

Nginx关闭

  • ./nginx -s stop 查看进程可以看见进程结束
  • 也可以直接杀死进程

Nginx重新加载

  • 当修改配置文件之后,不需要关闭重启,重新即可更新配置文件
    ./nginx -s reload

Nginx配置文件

配置文件位置

  • 配置文件默认在nginx的conf目录下的nginx.conf
    cd /usr/local/nginx/conf
    nginx - 图12

配置文件内容

全局块

从配置文件到events块之间,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  • 例如第一行配置的
    #user nobody;
    worker_processes 1;
    表示nginx处理并发的配置,worker_processes 越大,并发处理量也就越大。但可能收到硬软件制约。

events块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process

下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word

process 可以同时支持的最大连接数等。这部分对nginx性能影响较大。

  1. events {
  2. worker_connections 1024;
  3. }
  • worker_connections 1024;

表示worker process支持的最大连接数是1024。

http块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。http 块也可以包括 http 全局块server 块

  1. http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  5. # '$status $body_bytes_sent "$http_referer" '
  6. # '"$http_user_agent" "$http_x_forwarded_for"';
  7. #access_log logs/access.log main;
  8. sendfile on;
  9. #tcp_nopush on;
  10. #keepalive_timeout 0;
  11. keepalive_timeout 65;
  12. #gzip on;
  13. server {
  14. listen 80;
  15. server_name localhost;
  16. #charset koi8-r;
  17. #access_log logs/host.access.log main;
  18. location / {
  19. root html;
  20. index index.html index.htm;
  21. }
  22. #error_page 404 /404.html;
  23. # redirect server error pages to the static page /50x.html
  24. #
  25. error_page 500 502 503 504 /50x.html;
  26. location = /50x.html {
  27. root html;
  28. }
  29. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  30. #
  31. #location ~ \.php$ {
  32. # proxy_pass http://127.0.0.1;
  33. #}
  34. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  35. #
  36. #location ~ \.php$ {
  37. # root html;
  38. # fastcgi_pass 127.0.0.1:9000;
  39. # fastcgi_index index.php;
  40. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  41. # include fastcgi_params;
  42. #}
  43. # deny access to .htaccess files, if Apache's document root
  44. # concurs with nginx's one
  45. #
  46. #location ~ /\.ht {
  47. # deny all;
  48. #}
  49. }
  50. # another virtual host using mix of IP-, name-, and port-based configuration
  51. #
  52. #server {
  53. # listen 8000;
  54. # listen somename:8080;
  55. # server_name somename alias another.alias;
  56. # location / {
  57. # root html;
  58. # index index.html index.htm;
  59. # }
  60. #}
  61. # HTTPS server
  62. #
  63. #server {
  64. # listen 443 ssl;
  65. # server_name localhost;
  66. # ssl_certificate cert.pem;
  67. # ssl_certificate_key cert.key;
  68. # ssl_session_cache shared:SSL:1m;
  69. # ssl_session_timeout 5m;
  70. # ssl_ciphers HIGH:!aNULL:!MD5;
  71. # ssl_prefer_server_ciphers on;
  72. # location / {
  73. # root html;
  74. # index index.html index.htm;
  75. # }
  76. #}
  77. }

http全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server块

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

全局server块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

location块

一个 server 块可以配置多个 location 块。 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。简略说:就是配置请求的路由地址,以及处理

location指令说明:

nginx - 图13

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

Nginx配置实例

反向代理

实例一

打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到liunx 系统 tomcat 主页面中

  • 在linux中安装tomcat
    • 通过Xftp上传tomcat压缩包
      nginx - 图14
    • 解压压缩包
      zip -zxf apache-tomcat-9.0.58.tar.gz
    • 检查jdk是否安装
      java -version
    • 进入tomcat的bin目录执行
      ./startup.sh即可开启tomcat
  • 放行tomcat默认的8080端口
    sudo firewall-cmd --add-port=8080/tcp --permanent
    重启防火墙
    firewall-cmd --reload
  • 配置Windows的域名映射路径去访问nginx
    nginx - 图15
    在host文件下配置
    192.168.241.130 www.123.com
  • 配置nginx反向代理
    cd /usr/local/nginx/conf
    vim nginx.conf
    修改以下内容:
    nginx - 图16
  • 重启nginx
    在sbin目录 ./nginx -s reload
  • 即可通过浏览器访问ww.123.com ,由nginx代理到tomcat
    nginx - 图17

实例二

使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,nginx 监听端口为 9001,访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081,访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082

  • 创建2个不同端口的tomcat服务器
    • 在usr/src目录下 mkdir 创建2个tomcat-8080和tomcat-8081文件夹,将压缩包传入,解压并开启tomcat服务,其中一个tomcat需要将端口改为8081
    • vim tomcat-8081/conf/server.xml 中将冲突的8080端口改为8081,shutdown端口将8005改为8015
    • 上传页面到两个tomcat的webapps目录下,页面自行修改来标志tomcat的不同
      nginx - 图18
  • 配置nginx反向代理
    vim /usr/local/nginx/conf/nginx.conf
    nginx - 图19
    此时重启nginx,使配置文件生效。
  • 放行端口
    sudo firewall-cmd --add-port=9001/tcp --permanent
    sudo firewall-cmd --add-port=8081/tcp --permanent
    重启防火墙
    firewall-cmd --reload
  • 测试:
    nginx - 图20
    nginx - 图21

负载均衡

负载均衡分配实例

访问 http://192.168.241.130/edu/test.html 通过负载均衡分配到不同的服务器。

  • 创建2个tomcat服务器,反向代理实例时已经配置过,此处只需修改8081端口的vod文件名为edu
    nginx - 图22
  • nginx配置负载均衡
    nginx - 图23
    此时重启nginx,使配置文件生效。
  • 测试:
    nginx - 图24
    测试刷新会跳转到8081服务器
    nginx - 图25

负载均衡分配策略

  • 轮询分配(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果有服务器宕机,也可以自动将宕机的服务器剔除。
  • weight分配
    根据权重分配请求数量,weight代表权重为一。
    nginx - 图26
  • ip_hash分配
    每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题
    nginx - 图27
  • fair(第三方)分配
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    nginx - 图28

动静分离

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

两种动静分离方式:

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
    通过 location 指定不同的后缀名实现不同的请求转发,同时可以设置empires使浏览器缓存过期时间,减少服务器的请求。empires设置资源过期时间后,访问时会在浏览器确认是否过期,未过期直接使用,不发送请求给服务端,适合不变动的资源。

动静分离实例

  • 创建data文件夹,创建image和www存放静态页面和图像
    nginx - 图29
  • 配置nginx
    nginx - 图30
    此时重启nginx,使配置文件生效。
  • 测试:
    访问图片地址
    nginx - 图31
    访问静态页面
    nginx - 图32

Nginx集群

当服务器宕机后,nginx会通过负载均衡处理,而如果当nginx宕机后,如果配置了集群会自动使用从服务器,配置集群需要安装Keepalived,但此时Keepalived会提供一个虚拟ip,通过虚拟ip访问,当nginx宕机后,Keepalived会自动将ip绑定到另一个nginx服务器。

主从模式

nginx - 图33

搭建集群

  • 此时需要2个nginx服务器,所以需要使用另一个服务器开启nginx,创建另外一个虚拟机开启,此时可以使用虚拟机克隆,不用再次安装nginx
    nginx - 图34
    克隆后修改本机的ip地址和主机名。
  • 分别在2个服务器上开启nginx,使用浏览器测试是否可以访问
  • 2个服务器都需要安装Keepalived
    进入usr目录使用yum安装 yum install keepalived -y
  • 修改 Keepalived 配置文件
    在 /etc/keepalived 下修改 keepalived.conf,不同的服务器注意修改内容,修改smtp_server,state,priority
    ``` global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc }

    notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.241.130 # 本机的IP smtp_connect_timeout 30 router_id LVS_DEVEL }

vrrp_script chk_http_port { script “/usr/local/src/nginx_check.sh” # 脚本位置 interval 2 #(检测脚本执行的间隔) weight 2 }

vrrp_instance VI_1 { state MASTER # 备份服务器上将 MASTER 改为 BACKUP interface ens32 //网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.241.50 // VRRP H 虚拟地址 } }

  1. - 配置keepalived脚本,将其放在配置文件配置的 /usr/local/src/nginx_check.sh 下,2台服务器一致

!/bin/bash

A=ps -C nginx –no-header |wc -l if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ ps -C nginx --no-header |wc -l -eq 0 ];then killall keepalived fi fi ```

  • 同时启动nginx和keepalived
    ./nginx
    systemctl start keepalived.service
    可查看进程是否启动成功 ps -ef | grep keepalived
  • 测试:
    浏览器访问
    nginx - 图35
    此时停掉主服务器的nginx和keeplived
    `systemctl stop keepalived.service./nginx -s stop`
    刷新页面,还是可以访问nginx。

Nginx原理与优化参数配置

master-worker工作方式

  • 介绍
    nginx - 图36
  • 工作机制
    nginx - 图37
  • 好处:
    • 对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程。worker进程异常只会影响当前worker的请求,而不会影响所有请求。
    • 可以使用 nginx -s reload 进行热部署,利用nginx进行热部署操作。
  • 需要设置多少个worker?
    • worker_processes 为worker的数量。
    • Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
  • 连接数
    • worker_connection表示每个 worker 进程所能建立连接的最大值发送普通静态请求占用2个连接数,而发送动态请求则会占用4个连接数(如:反向代理会建立后端连接会多占用2个连接数)
  • 最大并发数
    • 普通静态资源请求的并发数为 worker_connections * worker_processes /2
    • 动态资源请求的并发数为 worker_connections * worker_processes /4