Nginx

本文介绍了Nginx在解决访问不同微服务和轮询访问需求中的作用,详细讲解了Nginx的下载、安装、启动过程,以及在Linux环境下的配置。还探讨了Nginx的命令行参数、配置文件结构,特别是反向代理、负载均衡和动静分离的配置实例,帮助读者理解Nginx在分布式微服务架构中的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看2个实际需求,引出Nginx

需求1:访问不同微服务

在这里插入图片描述

需求2:轮询访问服务

在这里插入图片描述

解决方案:Nginx

反向代理
负载均衡
动静分离
高可用集群

Nginx 在分布式 微服务 架构的位置

在这里插入图片描述

基本介绍

Nginx是什么?能干什么

在这里插入图片描述

Nginx 下载&安装&启动

下载

在这里插入图片描述

安装

安装Linux,登录Linux

在这里插入图片描述
ping www.baidu.com

具体安装步骤

在这里插入图片描述

1.搭建gcc环境

yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
在这里插入图片描述
在这里插入图片描述

2.将nginx-1.20.2.tar.gz 上传到Linux /opt目录
3.切换到/opt目录,解压nginx-1.20.2.tar.gz

tar -zxvf nginx-1.20.2.tar.gz

3.1将解压后的文件放到指定位置

mv nginx-1.20.2 /usr/local/nginx

4.进入文件目录

cd /usr/local/nginx

5.配置nginx路径

./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --conf-path=/usr/local/nginx/nginx.conf

6.补全nginx配置目录

mkdir /var/temp/nginx -p

7.编译并安装

make && make install

8.测试配置与nginx是否正常,当出现successful即可

./sbin/nginx -t
在这里插入图片描述

9.启动nginx

./sbin/nginx -c nginx.conf

10.查看进程/或端口

ps -ef | grep nginx
在这里插入图片描述

验证是否安装成功

在这里插入图片描述

设置防火墙,让Windows访问Nginx

在这里插入图片描述

具体配置
  • 查看开放的端口号
    firewall-cmd --list-all

  • 设置开放的端口号
    firewall-cmd --add-service=http --permanent
    firewall-cmd --add-service=80/tcp --permanent

  • 重启防火墙
    firewall-cmd --reload

Nginx 命令行参数

指令说明

在这里插入图片描述

使用演示

在这里插入图片描述

  • 启动 /usr/local/nginx/sbin/nginx -c nginx.conf
  • 停止 /usr/local/nginx/sbin/nginx -s stop
  • 重新加载(不需要重启) /usr/local/nginx/sbin/nginx -s reload
  • 查看版本 /usr/local/nginx/sbin/nginx -v
  • 查看版本,配置参数 /usr/local/nginx/sbin/nginx -V

nginx.conf 配置文件

基本说明

Nginx的配置文件位置

在这里插入图片描述

多说一句:使用 /usr/local/nginx/sbin/nginx 启动Nginx,默认用的是安装目录\nginx.conf 配置文件
作用:完成对Nginx的各种配置,包括端口,并发数,重写规则等
nginx.conf组成

全局块
events 块
http 块

nginx.conf 详细文档

在这里插入图片描述

详细内容
 
#Nginx用户及组:用户 组。window下不指定
#user  nobody;
 
#工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
worker_processes  1;
 
#错误日志:存放路径。
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid(进程标识符):存放路径
pid       /usr/local/nginx/logs/nginx.pid;
 
#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。
#但是由于nginx负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。
#LINUX系统可以执行 sysctl -a | grep fs.file 可以看到linux文件描述符。
worker_rlimit_nofile 65535;
 
 
events {
	#使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
	use epoll;
	
	#单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections  1024;
	
	#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
	#一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
	#client_header_buffer_size 4k;
}
 
 
http {
	#设定mime类型,类型由mime.type文件定义
    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"';
	
		
	#用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径
	#记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
	#access_log  logs/host.access.log  main;
	#access_log  logs/host.access.404.log  log404;
	
	#服务器名字的hash表大小
    server_names_hash_bucket_size 128;
	
	#客户端请求头缓冲大小。
    #nginx默认会用client_header_buffer_size这个buffer来读取header值,
    #如果header过大,它会使用large_client_header_buffers来读取。
    #如果设置过小HTTP头/Cookie过大 会报400 错误 nginx 400 bad request
    #如果超过buffer,就会报HTTP 414错误(URI Too Long)
    #nginx接受最长的HTTP头部大小必须比其中一个buffer大
    #否则就会报400的HTTP错误(Bad Request)
    #client_header_buffer_size 32k;
    #large_client_header_buffers 4 32k;
	
	
	#隐藏ngnix版本号
    #server_tokens off;
	
	#忽略不合法的请求头
    #ignore_invalid_headers   on;
	
	#让 nginx 在处理自己内部重定向时不默认使用  server_name设置中的第一个域名
    #server_name_in_redirect off;
	
	
	#客户端请求体的大小
    #client_body_buffer_size    8m;
   
  
    #开启文件传输,一般应用都应设置为on;若是有下载的应用,则可以设置成off来平衡网络I/O和磁盘的I/O来降低系统负载
    sendfile        on;
	
	
	#告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
    #tcp_nopush     on;
	
	#tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果
    #tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果
	tcp_nodelay on;
	
 
    #长连接超时时间,单位是秒
    keepalive_timeout  65;
 
    #gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
    #gzip  on;                     #开启gzip
    #gzip_min_length  1k;          #最小压缩大小
    #gzip_buffers     4 16k;       #压缩缓冲区
    #gzip_http_version 1.0;        #压缩版本
    #gzip_comp_level 2;            #压缩等级
    #gzip_types   text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;#压缩类型
    
	
	
	
    #负载均衡
	#max_fails为允许请求失败的次数,默认为1
	#weight为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
    # upstream myServer{
    #   server  192.168.247.129:8080 max_fails=3 weight=2;
    #   server  192.168.247.129:8081 max_fails=3 weight=4;	
    # }
	
	
	
    #server {
    #    listen       80;
	#	
	#	#IP/域名可以有多个,用空格隔开
	#	server_name  192.168.247.129;
	#	#server_name  www.test.com;
	#
    #    #charset koi8-r;
	#
    #    #access_log  logs/host.access.log  main;
	#	
	#   #反向代理配置,
    #   #将所有请求为www.test.com的请求全部转发到upstream中定义的目标服务器中。
    #   location / {
	#   			
	#	    #此处配置的域名必须与upstream的域名一致,才能转发。
	#	    proxy_pass http://myServer;
	#	    #proxy_pass http://192.168.247.129:8080;
	#		
	#		 proxy_connect_timeout 20;          #nginx跟后端服务器连接超时时间(代理连接超时)
	#		
    #        #client_max_body_size       10m;   #允许客户端请求的最大单文件字节数
    #        #client_body_buffer_size    128k;  #缓冲区代理缓冲用户端请求的最大字节数
	#		 #proxy_send_timeout         300;   #后端服务器数据回传时间(代理发送超时)
    #        #proxy_read_timeout         300;   #连接成功后,后端服务器响应时间(代理接收超时)
    #        #proxy_buffer_size          4k;    #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    #        #proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    #        #proxy_busy_buffers_size    64k;   #高负荷下缓冲大小(proxy_buffers*2)
    #        #proxy_temp_file_write_size 64k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传    		
	#		
	#		root   html;
	#		
	#		#定义首页索引文件的名称
	#		index  index.html index.htm;
    #    }
	#
    #   #动静分离 静态资源走linux 动态资源走tomcat
    #   # 注意 /source/image/下面寻找资源
    #   location /image/ {
    #       root /source/;
	#       autoindex on;
    #   } 		
	#
	#
	#    # 出现50x错误时,使用/50x.html页返回给客户端
    #    error_page   500 502 503 504  /50x.html;
    #    location = /50x.html {
    #        root   html;
    #    }
    #}
		
		
		
	#下面是配置生产环境中既支持HTTP又支持HTTPS,保证用户在浏览器中输入HTTP也能正常访问
	
	# SSL证书 配置                                 
	ssl_certificate     	cert/yphtoy.com.pem;   #加密证书路径
	ssl_certificate_key	cert/yphtoy.com.key;       #加密私钥路径
	ssl_protocols		TLSv1 TLSv1.1 TLSv1.2;     #加密协议
	ssl_session_cache	shared:SSL:1m;             #加密访问缓存设置,可以大大提高访问速度
	ssl_session_timeout	10m;                       #加密访问缓存过期时间
	ssl_ciphers		HIGH:!aNULL:!MD5;              #加密算法
	ssl_prefer_server_ciphers on;	               #是否由服务器决定采用哪种加密算法
	
	# 负载均衡
	upstream api_upstream
	{
	    server 127.0.0.1:8080 max_fails=3 weight=1;
		server 127.0.0.1:8081 max_fails=3 weight=1;
	}
	
	#api 接口(兼容HTTP)
	server{
	    listen 80;
		server_name api.test.com;
		# 301重定向跳转到HTTPS接口
		return 301 https://$server_name$request_uri;
		error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}
	
	#api 接口(兼容HTTPS)
	server{
	    listen 443 ssl;
		server_name api.test.com;
		location / {
		   root html;
		   index  index.html index.htm;
		   proxy_pass http://api_upstream;
		   
		   #语法: proxy_cookie_path oldpath replacepath;
		   #oldpath就是你要替换的路径 replacepath 就是要替换的值
		   #作用:同一个web服务器下面多个应用之间能获取到cookie
		   proxy_cookie_path /api/ /;
		   
		   #服务端接收的请求头Cooke值不变
		   proxy_set_header Cookie $http_cookie;
		}
	}
	
	#管理后台端(兼容HTTP)
	server{
	    listen 80;
		server_name manage.test.com;
		# 301重定向跳转到HTTPS接口
		return 301 https://$server_name/$request_uri;
		error_page 500 502 503 504 /50x.html;
		location = /50x.html{
			 root html	
		}
	}
	
	#管理后台端(兼容HTTPS)
	server{
	    listen 443 ssl;
		server_name manage.test.com;
		location / {
		    root /home/test/web/dist
			
			index /index.html;
			
			
			#语法:try_files 【$uri】 【 $uri/】 【参数】
			#当用户请求https://manage.test.com/login时,
			#一.如果配置了上面的默认index,会依次请求
			#1./home/test/web/dist/login       查找有没有login这个文件,没有的话
			#2./home/test/web/dist/index.html  有就直接返回
			
			#二.如果没有配置了上面的默认index或者配置了没有找到对应的资源,会依次请求
			#1./home/test/web/dist/login        查找有没有login这个文件,没有的话
			#2./home/test/web/dist/login/       查找有没有login这个目录,没有的话
		    #3.请求https://manage.test.com/index.html  nginx内部做了一个子请求
			
			#三.总的来说,index的优先级比try_files高,请求会先去找index配置,这里最后一个参数必须存在
			try_files $uri $uri/ /index.html;	
			
			
			
			#解决跨域问题
            #允许跨域请求地址(*表示全部,但是无法满足带cookie请求,因为cookie只能在当前域请求)
            add_header Access-Control-Allow-Origin $http_origin;
            #允许接收cookie和发送cookie
            add_header Access-Control-Allow-Credentials 'true';
            #允许请求的方法
            add_header Access-Control-Allow-Methods 'GET,POST,DELETE,PUT,OPTIONS';
            #允许请求头(Content-Type:请求数据/媒体类型 x-requested-with:判断请求是异步还是同步 自定义header 比如 token)
            add_header Access-Control-Allow-Headers $http_access_control_request_headers;
            #浏览器缓存请求头信息,1800秒内,只会有1次请求,不会出现"OPTIONS"预请求,节约资源
            #add_header Access-Control-Max-Age '1800';
		    if ($request_method = 'OPTIONS') {
                    return 204;
            }
			
			
			#服务端HttpServletRequest可以获得用户的真实ip
		    proxy_set_header X-Real-IP $remote_addr;
			
			#服务端HttpServletRequest可以获得用户的真实ip和经过的每一层代理服务器的ip
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			
			#服务端接收的请求头Host值不变
            proxy_set_header Host  $http_host;
			
            proxy_set_header X-Nginx-Proxy true;
		}
	}
	
}

nginx.conf讲解

一张图说明nginx.conf结构

在这里插入图片描述

全局快:

配置影响nginx全局的指令,如:用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等

events 块:

配置影响nginx服务器或与用户的网络连接,如:每个进程的最大连接数,选取哪张事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。

http 块:

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块配置,如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求等

http 全局块:如upstream,错误页面,连接超时等
server块 配置虚拟主机的相关参数,一个http中可以有多个server
location 配置请求的路由,已经各种页面的处理情况
全局块
说明

在这里插入图片描述

简单分析

在这里插入图片描述

events 块
说明

在这里插入图片描述

简单分析

在这里插入图片描述

http 块
说明

在这里插入图片描述

http 全局块

在这里插入图片描述

server 块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反向代理-快速入门

需求说明/图解

在这里插入图片描述

反向代理配置-思路分析/图解

在这里插入图片描述

实现步骤

在这里插入图片描述

修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名

在这里插入图片描述

修改 安装目录\nginx.conf

在这里插入图片描述

小技巧如何查看nginx.conf 的配置错误

在这里插入图片描述

完成测试

在这里插入图片描述

主要事项和细节

在这里插入图片描述

返向代理配置-Location实例

需求说明/图解

在这里插入图片描述

方向代理配置-思路分析/图解

在这里插入图片描述

Location语法规则
Location规则

语法规则: location [=||*|^~] /uri/ {… }
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

符号含义
== 开头表示精确匹配
^~^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
~~ 开头表示区分大小写的正则匹配
~*~* 开头表示不区分大小写的正则匹配
!~ 和 !~*!~ 和 !~*分别为区分大小写不匹配及不区分大小写不匹配的正则
/用户所使用的代理(一般为浏览器)
$http_x_forwarded_for可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer可以记录用户是从哪个链接访问过来的
匹配规则示例:
location = / {
          #规则A
      }
      location = /login {
          #规则B
      }
      location ^~ /static/ {
          #规则C
      }
      location ~ \.(gif|jpg|png|js|css)$ {
          #规则D
      }
      location ~* \.png$ {
          #规则E
      }
      location !~ \.xhtml$ {
          #规则F
      }
      location !~* \.xhtml$ {
          #规则G
      }
      location / {
          #规则H
      }

那么产生的效果如下:

  1. 访问根目录/,比如http://localhost/将匹配规则A
  2. 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H
  3. 访问 http://localhost/static/a.html 将匹配规则C
  4. 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C
  5. 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
  6. 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
  7. 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为方向代理服务器存在。
实际常用规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
这里是直接转发给后端应用服务器了,也可以是一个静态首页。

第一个必选规则

    location = / {
       proxy_passhttp://tomcat:8080/index
      }

第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

    location ^~ /static/ {
       # 请求/static/a.txt 将被映射到实际目录文件:/webroot/res/static/a.txt
       root /webroot/res/;
    }
     location ~* \.(gif|jpg|jpeg|png|css|js|ico)${
       root /webroot/res/;
    }

第三个规则就是通用规则,用来转发动态请求到后端应用服务器
非静态文件请求就默认是动态请求,自己根据实际把握
毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了

    location / {
       proxy_pass http://tomcat:8080/
    }
Location解析过程

在这里插入图片描述第一个必选规则

总结:
1、 先判断精准命中,如果命中,立即返回结果并结束解析过程。
2、 判断普通命中,如果有多个命中,“记录”下来“最长”的命中结果(记录但不结束,最长的为准)。
3、 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上至下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程。
4、 普通命中顺序无所谓,是因为按命中的长短来确定。正则命中,顺序有所谓,因为是从前入往后命中的。
5、= 的精确匹配优先级最高,无论放置的顺序如何,它都将优先被匹配并执行。 / 为默认匹配,即如果没有匹配上其他的location,则最后匹配默认匹配的部分。

实现步骤

在这里插入图片描述

修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟机名

在这里插入图片描述

修改 安装目录\nginx.conf

在这里插入图片描述

在Linux的Tomcat 创建 webapps\product\hi.html
在windows的Tomcat 创建 webapps\member\hi.html

在这里插入图片描述

测试

在这里插入图片描述

负载均衡-配置实例

需求说明/图解

在这里插入图片描述

负载均衡配置-思路分析

在这里插入图片描述

负载均衡配置规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现步骤

在这里插入图片描述

修改 C:Windows\System32\drivers\etc\hosts 配置虚拟主机名

在这里插入图片描述

修改安装目录\nginx.conf

在这里插入图片描述
在这里插入图片描述

在Linux的Tomcat8080 创建 webapp\search\look.html

在这里插入图片描述

在Linux下重新安装一份Tomcat,并将端口修改成8081

在这里插入图片描述
在这里插入图片描述

linux 防火墙打开 80端口,保证外网可以访问
完成测试

在这里插入图片描述
在这里插入图片描述

注意事项和避免的坑

在这里插入图片描述
在这里插入图片描述

几个小实验
文档: Nginx的upstream配置技巧

在这里插入图片描述

动静分离-应用实例

什么是动静分离

在这里插入图片描述
在这里插入图片描述

需求说明/图解在这里插入图片描述
动静配置-思路分析/图解

在这里插入图片描述

动静分离步骤
    location ^~ /static/ {
       # 请求/static/a.txt 将被映射到实际目录文件:/webroot/res/static/a.txt
       root /webroot/res/;
    }
     location ~* \.(gif|jpg|jpeg|png|css|js|ico)${
       root /webroot/res/;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值