Ngnix入门概述

什么是Nginx?

Nginx (engine x) 是一款轻量级的、高性能的HTTP和反向代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,处理高并发能力是十分强大的,能经受高负载的考验。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构可能是这样:

画板

事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构可能是这样:

Nginx - 图2

在这样的架构中 , Nginx 所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达 Nginx 上,再由 Nginx 根据提前配置好的转发规则,将客户端发来的请求转发到某一个 Tomcat 上去。

那么这里涉及到两个概念:

  • 负载均衡服务器
  • 反向代理服务器

负载均衡服务器

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。 上面这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢? 我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢? 上面的分析我们排除了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡就是进行请求转发,降低某一个服务器的压力 负载均衡策略很多,也有很多层,对于一些大型网站基本上从 DNS 就开始负载均衡,负载均衡有硬件和软件之分,各自代表分别是 F5** Nginx** (目前 Nginx 已经被 F5 收购),早些年也可以使用 Apache 来做负载均衡,但是效率不如 Nginx ,所以现在主流方案是 Nginx

反向代理服务器

另一个概念是反向代理服务器,在学习这之前我们先说下正向代理,如下图:

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

画板

Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 上图这个过程,Google 并不知道真正访问它的客户端是谁,它只知道这个中间服务器在访问它。因此,这里的代理,实际上是中间服务器代理了客户端,这种代理叫做正向代理。 那么什么是反向代理呢?看下面一张图:

Nginx - 图4

在这个过程中,10086 这个号码相当于是一个代理,真正提供服务的,是话务员,但是对于客户来说,他不关心到底是哪一个话务员提供的服务,他只需要记得 10086 这个号码就行了。 所有的请求打到 10086 上,再由 10086 将请求转发给某一个话务员去处理。在这里 10086 就相当于是一个代理,只不过它代理的是话务员而不是客户端,这种代理称之为反向代理。

动静分离

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

Nginx的优势

在 Java 开发中,Nginx 有着非常广泛的使用,随便举几点:
  1. 使用 Nginx 做静态资源服务器:Java 中的资源可以分为动态和静态,动态需要经过 Tomcat 解析之后,才能返回给浏览器,如 JSP 页面、Freemarker、Thymeleaf 页面、控制器返回的 JSON 数据等,都算作动态资源,动态资源经过了 Tomcat 处理,速度必然降低。对于静态资源,例如图片、HTML、JS、CSS 等资源,这种资源可以不必经过 Tomcat 解析,当客户端请求这些资源时,之间将资源返回给客户端就行了。此时,可以使用 Nginx 搭建静态资源服务器,将静态资源直接返回给客户端。
  2. 使用 Nginx 做负载均衡服务器,无论是使用 Dubbo 还是 Spirng Cloud ,除了使用各自自带的负载均衡策略之外,也都可以使用 Nginx 做负载均衡服务器。
  3. 支持高并发、内存消耗少、成本低廉、配置简单、运行稳定等。

Nginx安装使用

安装环境和工具
  • CentOS7
  • nginx-1.16.1.tar.gz
  • xshell
Nginx由于基本上都是在 Linux 上使用,因此我们主要向大家展示 CentOS 7 安装 Nginx:

先安装nginx依赖的包

  • gcc安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc yum install gcc-c++
  • PCREPCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。yum install -y pcre pcre-devel注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
  • zlib zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。yum install -y zlib zlib-devel
  • openssl OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。yum install -y openssl openssl-devel
  1. yum install gcc-c++
  2. yum install -y pcre pcre-devel
  3. yum install -y zlib zlib-devel
  4. yum install -y openssl openssl-devel

Nginx的源码上传到linux系统,并解压

这一步可以使用软件,也可以用代码的方式。nginx-1.16.1.tar.gz包拷贝到“/usr/local/nginx”下。然后解压。

解压

  1. tar -zxvf nginx-1.16.1.tar.gz

改名

  1. mv nginx-1.16.1 nginx

安装

  1. 上面的步骤操作完成后,在/usr/local/src里面会有一个nginx的文件夹,进入后,pwd 查看当前所在目录
  1. [root@192 nginx]# pwd
  2. /usr/local/src/nginx
  1. 创建usr/nginx目录 —-安装目录
  1. [root@192 nginx]# mkdir /usr/nginx
  1. 运行configure

./configure —prefix=/usr/nginx

  1. make编译
  2. 编译安装
  3. 查询是否安装成功
  1. make //编译
  2. make install //编译安装
  1. [root@192 nginx]# ls /usr/nginx/
  2. conf html logs sbin

本地访问linux中nginx,默认不能访问的,因为防火墙问题

(1)关闭防火墙

(2)开放访问的端口号, 80 端口

  1. 查看开放的端口号
  2. firewall-cmd --list-all
  3. 设置开放的端口号
  4. firewall-cmd --add-service=http permanent
  5. firewall-cmd --add-port=80/tcp --permanent
  6. 重启防火墙
  7. firewall-cmd --reload

Nginx目录说明

  1. [root@192 nginx]# ll /usr/nginx/
  2. total 4
  3. drwxr-xr-x. 2 root root 4096 Dec 28 17:49 conf
  4. drwxr-xr-x. 2 root root 40 Dec 28 17:49 html
  5. drwxr-xr-x. 2 root root 6 Dec 28 17:49 logs
  6. drwxr-xr-x. 2 root root 19 Dec 28 17:49 sbin

conf 配置文件

html 静态文件

logs 日志文件

sbin 命令 启动 停止等等命令

Nginx的启动&停止

  1. 启动
  2. cd /usr/nginx
  3. cd sbin
  4. ./nginx
  5. 停止
  6. ./nginx -s stop

进行测试

浏览器输入Linux的IP地址加端口号默认为80,如:http://IP:8080 看到如下界面安装成功

Nginx - 图5

常用命令

  1. 进入 nginx 目录中
  2. /usr/nginx/sbin
  3. 查看程序的进程
  4. ps -ef | grep nginx
  5. undefined 查看 nginx 版本号 ./nginx -v
  6. undefined 启动 nginx ./nginx
  7. undefined 停止 nginx ./nginx -s stop
  8. undefined 重新加载 nginx /nginx -s reload

Nginx配置文件

Nginx的主配置文件是nginx.conf,它包含了Nginx服务器的主要配置信息,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。在nginx.conf配置文件中分为三个模块:

  • 全局块:从配置文件开始到events块之间,主要是设置一些影响nginx服务器整体运行的配置指令
  • events块:影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多workprocess下的网络连接进行序列化,是否允许同时接收多个网络连接等等
  • http块:如反向代理和负载均衡都在此配置
  1. main # 全局配置,对全局生效
  2. ├── events # 配置影响 Nginx 服务器或与用户的网络连接
  3. ├── http # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
  4. ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
  5. ├── server # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
  6. ├── server
  7. ├── location # server 块可以包含多个 location 块,location 指令用于匹配 uri
  8. ├── location
  9. └── ...
  10. └── ...
  11. └── ...
  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;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. # '$status $body_bytes_sent "$http_referer" '
  15. # '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log logs/access.log main;
  17. sendfile on;
  18. #tcp_nopush on;
  19. #keepalive_timeout 0;
  20. keepalive_timeout 65;
  21. #gzip on;
  22. server {
  23. # 监听的端口号
  24. listen 80;
  25. server_name localhost;
  26. #charset koi8-r;
  27. #access_log logs/host.access.log main;
  28. location / {
  29. root html;
  30. index index.html index.htm;
  31. }
  32. #error_page 404 /404.html;
  33. # redirect server error pages to the static page /50x.html
  34. #
  35. error_page 500 502 503 504 /50x.html;
  36. location = /50x.html {
  37. root html;
  38. }
  39. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  40. #
  41. #location ~ \.php$ {
  42. # proxy_pass http://127.0.0.1;
  43. #}
  44. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  45. #
  46. #location ~ \.php$ {
  47. # root html;
  48. # fastcgi_pass 127.0.0.1:9000;
  49. # fastcgi_index index.php;
  50. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  51. # include fastcgi_params;
  52. #}
  53. # deny access to .htaccess files, if Apache's document root
  54. # concurs with nginx's one
  55. #
  56. #location ~ /\.ht {
  57. # deny all;
  58. #}
  59. }
  60. # another virtual host using mix of IP-, name-, and port-based configuration
  61. #
  62. #server {
  63. # listen 8000;
  64. # listen somename:8080;
  65. # server_name somename alias another.alias;
  66. # location / {
  67. # root html;
  68. # index index.html index.htm;
  69. # }
  70. #}
  71. # HTTPS server
  72. #
  73. #server {
  74. # listen 443 ssl;
  75. # server_name localhost;
  76. # ssl_certificate cert.pem;
  77. # ssl_certificate_key cert.key;
  78. # ssl_session_cache shared:SSL:1m;
  79. # ssl_session_timeout 5m;
  80. # ssl_ciphers HIGH:!aNULL:!MD5;
  81. # ssl_prefer_server_ciphers on;
  82. # location / {
  83. # root html;
  84. # index index.html index.htm;
  85. # }
  86. #}
  87. }

配置文件中有很多#开头的表示注释内容,我们去掉所有以 # 开头的段落,精简后内容如下:

  1. # 全局模块
  2. worker_processes 1;
  3. # events模块
  4. events {
  5. worker_connections 1024;
  6. }
  7. # http模块
  8. http {
  9. include mime.types;
  10. default_type application/octet-stream;
  11. sendfile on;
  12. keepalive_timeout 65;
  13. server {
  14. listen 80;
  15. server_name localhost;
  16. location / {
  17. root html;
  18. index index.html index.htm;
  19. }
  20. error_page 500 502 503 504 /50x.html;
  21. location = /50x.html {
  22. root html;
  23. }
  24. }
  25. }

全局模块

全局块:配置服务器整体运行的配置指令,比如 <font style="color:rgb(51, 51, 51);">worker_processes 1</font>处理并发数的配置,error_log logs/error.log错误日志存放路位置等全局配置。

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

  1. user nginx; # 指定Nginx进程运行的用户和用户组。
  2. worker_processes 1; # 指定Nginx进程的数量,并发处理服务的关键配置,值越大支持并发处理量越多,但会受到硬件、软件等设备的制,建议设置为等于CPU总核心数
  3. error_log logs/error.log info; # 指定错误日志文件的路径和级别。
  4. pid logs/nginx.pid; # 指定Nginx进程ID文件的路径。

events模块

events块:影响 Nginx 服务器与用户的网络连接 比如 worker_connections 1024,作用:支持的最大连接数为 1024

  1. events {
  2. worker_connections 1024; #每个工作进程的最大连接数量(根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。)
  3. use epoll; # 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
  4. accept_mutex on; #开启网络连接的序列化(防止多个进程对连接的争抢)
  5. multi_accept on; #允许同时接收多个网络连接(默认关闭),工作进程都有能力同时接收多个新到达的网络连接
  6. }
  • events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括
    • 是否开启对多 work process下的网络连接进行序列化
    • 是否允许同时接收多个网络连接
    • 选取哪种事件驱动模型来处理连接请求,
    • 每个 wordprocess 可以同时支持的最大连接数等。
  • 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

http模块

http模块算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

  1. http {
  2. # 文件扩展名与文件类型映射表,默认不该
  3. include mime.types;
  4. # 默认文件类型,默认不该
  5. default_type application/octet-stream;
  6. # 默认编码,一般不用设置
  7. # charset utf-8;
  8. #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,---
  9. #---如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
  10. # 注意:如果图片显示不正常把这个改成off。
  11. sendfile on;
  12. # 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
  13. keepalive_timeout 65;
  14. # 这是nginx中的默认的一个配置,正式因为有了这个配置,我们刚刚安装nginx访问服务器会出现welcome to nginx的页面。
  15. server {
  16. # 设定要监听的端口,访问这个端口就会访问这个块中配置的相关资源
  17. listen 80;
  18. # 给这个服务命名,最好用这个服务器的域名命名
  19. server_name localhost;
  20. # location指令块,配置外部访问资源和实际资源的对应关系
  21. # location后面的【/】:表示配置外部访问网站路径/时候的配置,表示要处理什么路径的请求
  22. location / {
  23. # 表示静态资源所在的根目录
  24. root html;
  25. # 表示访问这个路径对应的默认静态资源文件或者网页文件,表示要处理什么路径的请求,并且index 后面可以跟多个静态资源。如果不配置默认找index.html
  26. index index.html index.htm;
  27. }
  28. # 设置网站的错误页面
  29. error_page 500 502 503 504 /50x.html;
  30. location = /50x.html {
  31. root html;
  32. }
  33. }
  34. # server块须包含在http之下,server可单独拆分为一个文件 在nginx下http块下引用即可
  35. include vhosts.conf;
  36. }

:::tips http块下还包含两部分:

:::

  1. http全局块:配置指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
  2. server模块:主机的设置。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机

接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过创建虚拟主机(server)的概念来将这些不同的服务配置隔离。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。 1. 全局 server 块最常见的配置是当前虚拟机主机的监听配置当前虚拟主机的名称或 IP 配置。 2. location 块:一个 server 块可以配置多个 location 块。 3. location模块:主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。 location 部分用于匹配网页位置(比如,根目录“/”,“/images”,等等),server 是对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。 Nginx - 图6 ### location 表达式类型 该指令用于匹配 URL,语法如下: 1. = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 2. ~:用于表示 uri 包含正则表达式,并且区分大小写。 3. ~:用于表示 uri 包含正则表达式,并且不区分大小写。 4. ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 uri 和请求字符串做匹配 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。 ### location 表达式类型优先级 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其它匹配项; 前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个 location 匹配的话,则使用表达式最长的那个; 正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其它匹配项; 常规字符串匹配,如果有多个 location 匹配的话,则使用表达式最长的那个; 优先级总结来说:(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径)

location下的 root和alias配置区别

参考:https://blog.csdn.net/tuoni123/article/details/79712246

root和alias都可以定义在location模块中使用,都是用来指定请求资源的真实路径
  1. # root,相当于追加在 root 目录后面 。真实的路径是root指定的值加上location指定的值。比如访问的是 xxx/test=>/www/test
  2. location /test {
  3. root html;
  4. index index.html index.htm;
  5. }
  6. # 实际访问到:html/test
  7. # alias指定的路径是location的别名,不管location的值怎么写,资源的 真实路径都是 alias 指定的路径 ,比如:访问的是 xxx/test,想要访问到/html/test 就必须设置 alias /html/test
  8. location / {
  9. root html/test;
  10. index index.html index.htm;
  11. }
  12. # 实际访问到:html/test

反向代理

反向代理示例一

实现效果:使用 nginx 反向代理,访问 www.nginxtest.com 直接跳转到 127.0.0.1:8080

在 liunx 系统安装 tomcat, 使用默认端口 8080

  • tomcat 安装文件放到 liunx 系统中,解压
  • 进入 tomcat 的 bin 目录中, ./startup.sh 启动 tomcat 服务器
  1. [root@192 tomcat8]# ls
  2. apache-tomcat-8.5.50 apache-tomcat-8.5.50.tar.gz
  3. [root@192 apache-tomcat-8.5.50]# cd bin/
  4. [root@192 bin]# ./startup.sh
  • 对外开放访问的端口
  • 查看已经开放的端口号firewall-cmd —list-all
  • 启动一个本机 tomcat,浏览器地址栏输入 127.0.0.1:8080,出现如下界面

Nginx - 图7

  • 通过修改本地 host 文件,将 www.nginxtest.com 映射到 192.168.1.7:8080
  • 配置完成之后,我们便可以通过 www.nginxtest.com:8080 访问到第一步出现的 Tomcat 初始界面。那么如何只需要输入 www.nginxtest.com 便可以跳转到 Tomcat 初始界面呢?便用到 nginx的反向代理。
  • 在 nginx.conf 配置文件中增加如下配置
  1. firewall-cmd --add-port=8080/tcp --permanent
  2. firewall-cmd --reload
  1. server {
  2. listen 80;
  3. server_name www.nginxtest.com # 添加IP名
  4. server_name localhost;
  5. #charset koi8-r;
  6. #access_log logs/host.access.log main;
  7. location / {
  8. root html;
  9. proxy_pass http://127.0.0.1:8080; # 添加IP地址
  10. index index.html index.htm;
  11. }
  12. # 其他省略
  13. }

反向代理示例二

实现效果:使用 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

  • 第一步,准备两个 tomcat,一个 8080 端口,一个 8081 端口,并准备好测试的页面 先关闭上一个示例题的tomcat查看Tomcat是否关闭 ps -ef|grep java如果你想直接干掉Tomcat,你可以使用kill命令,直接杀死Tomcat进程 kill -9 7010创建tomcat8080和tomcat8081两个文件夹,执行安装tomcat,解压进入启动,和上面的步骤一样
    • tomcat8080文件夹不需要变动
    • tomcat8081需要改变端口号,如下图所示,需要到 conf/server.xml
  • 在tomcat8080和tomcat8081文件夹下的解压的tomcat中的webapps中创建文件夹和网页
  1. <Connector port="8081" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443" />
  • 第二步修改 nginx 的配置文件,在http 块中添加 server{}
  1. server {
  2. listen 9001;
  3. server_name 192.168.1.7 ;
  4. location ~/edu/ {
  5. proxy_pass http://127.0.0.1:8080;
  6. }
  7. location ~/vod/ {
  8. proxy_pass http://127.0.0.1:8081;
  9. }

负载均衡

配置负载均衡,实现效果

  • 浏览器地址栏输入地址 http://192.168.1.7/edu/a.html,负载均衡效果,平均调用到 8080 和 8081 端口中
  • 首先准备两个同时启动的 Tomcat

Nginx - 图8

  • 在 nginx.conf 中进行配置

随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx、 LVS、 Haproxy 等等服务可以提供负载均衡服务。

  • 在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建 页面 a.html,用于测试
    • /usr/tomcat8/tomcat8081/apache-tomcat-8.5.50/webapps/edu
    • /usr/tomcat8/tomcat8080/apache-tomcat-8.5.50/webapps/edu
  • 在 nginx 的配置文件中进行负载均衡的配置
  1. upstream myserver{
  2. server 192.168.1.7:8080
  3. server 192.168.1.7:8081
  4. }
  1. server{
  2. listen 80;
  3. server_name 192.268.1.7;
  4. #charset koi8-r;
  5. #access_log logs/host.access.log main;
  6. location / {
  7. root html;
  8. proxy_pass http://myserver;
  9. index index.html index.htm;
  10. }

Nginx - 图9

Nginx - 图10

Nginx 提供了几种分配方式(策略)

  1. 轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
  2. eightweight 代表权重,默认为1,权重越高被分配的客户端越多指定轮询几率, weight 和访问比率成正比,用于后端服务器性能不均的情况。
  3. ip_hash每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
  4. fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

动静分离

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx处理静态页面, Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:

  1. 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
  2. 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。

在 liunx 系统中准备静态资源,用于进行访问

  1. - www:放入一个网页
  2. - image:放入一个图片
  3. - ![](https://cdn.nlark.com/yuque/0/2023/png/2408724/1680054432645-96f11a84-5b18-4cb6-906b-b887230ea51b.png)
在 nginx 配置文件中进行配置
  1. server{
  2. listen 80;
  3. server_name 192.268.1.7;
  4. #charset koi8-r;
  5. #access_log logs/host.access.log main;
  6. location /www/ {
  7. root /data/;
  8. index index.html index.htm;
  9. }
  10. location /image/ {
  11. root /data/;
  12. autoindex on;
  13. }

最终测试

前后端分离项目部署步骤

  1. 准备工作
  • 确保您的前端代码已经打包成静态文件(例如,HTML、CSS和JavaScript等)。
  • 确保您的后端代码已经打包成可执行的JAR文件或WAR文件。
  1. 安装Java环境和Tomcat服务器
  • 您需要安装Java环境和Tomcat服务器,以便在Nginx上部署您的Java后端应用程序。
  • 您可以在Tomcat的配置文件中指定Java应用程序的上下文路径和端口号。
  1. 部署后端应用程序
  • 将打包好的JAR文件或WAR文件上传到Tomcat的webapps目录下。
  • 启动Tomcat服务器,并检查后端应用程序是否已经成功部署。
  1. 部署前端应用程序
  • 将打包好的静态文件上传到您的Nginx服务器的Web根目录下(例如,/usr/share/nginx/html/)。
  • 您可以通过将静态文件打包成.zip或.tar.gz格式的压缩文件来快速上传和解压缩文件。
  1. 配置Nginx服务器
  • 您需要配置Nginx服务器作为反向代理服务器,以便它可以将请求转发到Tomcat服务器。
  • 在Nginx的配置文件中,您需要设置反向代理服务器的地址和端口号,并指定Java应用程序的URL路径。
  • 另外,您还需要将Nginx配置为提供静态文件服务。您可以使用以下示例配置:
  1. bashCopy codeserver {
  2. listen 80;
  3. server_name yourdomain.com;
  4. location /api {
  5. proxy_pass http://localhost:8080/yourapp/;
  6. proxy_set_header Host $host;
  7. proxy_set_header X-Real-IP $remote_addr;
  8. }
  9. location / {
  10. root /usr/share/nginx/html;
  11. index index.html;
  12. }
  13. }

在此示例中,Nginx将所有以/api开头的请求代理到Tomcat服务器上,并将所有其他请求作为静态文件服务处理。

  1. 重新启动Nginx服务器
  • 在完成Nginx配置后,请重启Nginx服务器以应用新的配置。
  • 您可以使用以下命令重新启动Nginx服务器:sudo systemctl restart nginx。
  1. 访问您的应用程序
  • 您现在可以使用Web浏览器访问您的Java前后端分离应用程序。
  • 请在浏览器中输入您的服务器的IP地址或域名,例如:http://yourdomain.com/

以上就是将Java前后端分离项目部署到Nginx上的详细步骤。请根据您的实际情况进行修改。

部署Vue项目到Nginx上

  1. 将开发好的Vue项目通过命令npm run builddist
  2. dist包上传到服务器,存放到/usr/local/nginx/html
  3. 假设现在Nginx已经安装好了,我们此时需要去配置nginx.conf配置文件,是请求的路径映射到对应的文件上
  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. root html/admin;
  6. index index.html index.htm;
  7. try_files $uri $uri/ /index.html;
  8. }
  9. }
  1. 重启Nginx ./nginx -t,访问即可 http://148.100.108.147/