nginx在linux下的使用以及SpringSession

    科技2025-04-28  16

    文章目录

    nginx优势(反向代理、负载均衡)nginx的安装nginx的访问分配策略流量限制根据ip控制速率控制并发连接数 静态文件服务器跨域配置允许全局的跨域允许指定路径跨域在代码中加入跨域配置 SpringSessionSpringBoot+SpringSession+Redis示例

    nginx优势(反向代理、负载均衡)

    作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,能够支持高达 50,000 个并发连接数的响应。作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率很优秀。作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。Nginx(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以安装非常的简单,配置文件 非常简洁做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

    nginx的安装

    联网安装nginx相关的依赖 yum -y install zlib zlib-devel openssl openssl-devel yum -y install patch 解压nginx压缩包 tar zxvf nginx-1.10.3.tar.gz 配置nginx编译环境 ./configure --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/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_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-stream --http-client-body-temp-path=/usr/local/nginx/tmp/client/ --http-proxy-temp-path=/usr/local/nginx/tmp/proxy/ <!-- 配置说明 1. /configure : 配置nginx的编译环境 2. –pid-path : nginx的进程文件存放目录 3. --error-log-path : 错误日志存放目录 4. --http-log-path : 请求日志存放目录 5. module : Nginx中的功能,基本上都是以module的形式存在 --> 编译安装 - 在nginx目录下(/usr/local/nginx/),编译,执行 make - 再执行 make install 验证nginx是否安装成功(出现版本号即安装成功) /usr/local/nginx/sbin/nginx -V 配置nginx.conf(服务器集群) 不要忘记提前把域名和服务器IP绑定在一起。 vim /usr/local/nginx/conf/nginx.conf

    校验nginx配置文件 /usr/local/nginx/sbin/nginx -t 应该会报错缺少文件夹,创建文件夹 mkdir -p /usr/local/nginx/tmp/client 校验成功,启动nginx /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 如果无法访问,80端口加入防火墙白名单,重启 <!--80端口(http端口)加入防火墙白名单:--> firewall-cmd --permanent --zone=public --add-port=80/tcp firewall-cmd --reload <!--重启nginx--> /usr/local/nginx/sbin/nginx -s reload

    nginx的访问分配策略

    默认是轮询

    流量限制

    为防止用户恶意访问,可以在nginx设置限流,防止发生雪崩效应。

    根据ip控制速率

    <!--在server {外 http模块加上如下内容,为方便测试,每秒处理1个请求--> limit_req_zone $binary_remote_addr zone=javasmlimit:10m rate=1r/s; <!--limit_req_zone 只能配置在 http 范围内; $binary_remote_addr代表客户端ip javasmlimit是自定义变量名 rate 请求频率,每秒允许多少请求;rate=3r/s; 每秒只处理3次请求,超过的请求拒绝处理。 10m缓冲区大小,1M能存储16000 IP地址,10M可以存储16W IP地址访问信息--> <!--在location / {内 location模块加上如下内容,表示当前请求会根据javasmlimit规则来限流--> limit_req zone=javasmlimit burst=3 nodelay; <!--#nodelay 不延迟处理 #burst 是配置超额处理,可简单理解为队列机制 # 上面配置同一个 IP 每秒只能发送一次请求(1r/s),这里配置了缓存3个请求,其它任务请求则失败(503错误)-->

    控制并发连接数

    http模块添加 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; location模块添加 limit_conn perip 10;#单个客户端ip与服务器的连接数 limit_conn perserver 100; #限制与服务器的总连接数 # 限制传输速度(如果有N个并发连接,则是 N * limit_rate) limit_rate 1024k;

    流量限制不会提高服务器性能,但是能让服务器更加健壮。

    静态文件服务器

    修改nginx.conf 第一行改为:user root;

    加入新的location

    提前创建好文件夹,在文件夹中传入静态文件(css、js、jpg等)mkdir -p /home/data

    两种配置方式

    root配置(了解)alias配置(推荐) location /static/ { alias /home/data/; } alias是指定目录的虚拟路径,location指定的名称是代替文件目录的访问路径 上面例子中,浏览器中输入static可以代替/home/data路径

    跨域配置

    允许全局的跨域

    <!--在配置文件server模块内,加入如下配置--> # 指定允许跨域的方法,*代表所有 add_header Access-Control-Allow-Methods *; # 预检命令的缓存,如果不缓存每次会发送两次请求 add_header Access-Control-Max-Age 3600; # 带cookie请求需要加上这个字段,并设置为true add_header Access-Control-Allow-Credentials true; # 表示允许这个域跨域调用(客户端发送请求的域名和端口) # $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号 add_header Access-Control-Allow-Origin $http_origin; # 表示请求头的字段 动态获取 add_header Access-Control-Allow-Headers $http_access_control_request_headers; # OPTIONS预检命令,预检命令通过时才发送请求 # 检查请求的类型是不是预检命令 if ($request_method = OPTIONS){ return 200; }

    允许指定路径跨域

    <!--在location模块内 加入以上配置-->

    在代码中加入跨域配置

    SpringSession

    分布式系统中,如何解决session共享问题?

    一个浏览器在访问多个web服务器时,多个服务器之间的session对象需要共享数据。

    使用SpringSession解决session共享问题。

    SpringSession介绍:

    SpringSession 是Spring家族中的一个子项目,Spring Session提供了用于管理用户会话信息的API和实现。它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中;

    SpringBoot+SpringSession+Redis示例

    添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> 设置配置文件 spring: redis: host: 127.0.0.1 password: root port: 6379 timeout: 3000 session: store-type: redis 发现此时已经可以达到Session共享。
    Processed: 0.015, SQL: 8