ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持相关的知识,希望对你有一定的参考价值。

#
# CORS header support
#
# One way to use this is by placing it into a file called "cors_support"
# under your Nginx configuration directory and placing the following
# statement inside your **location** block(s):
#
#   include cors_support;
#
# As of Nginx 1.7.5, add_header supports an "always" parameter which
# allows CORS to work if the backend returns 4xx or 5xx status code.
#
# For more information on CORS, please see: http://enable-cors.org/
# Forked from this Gist: https://gist.github.com/michiel/1064640
#

set $cors '';
if ($http_origin ~ '^https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)') {
        set $cors 'true';
}

if ($cors = 'true') {
        add_header 'Access-Control-Allow-Origin' "$http_origin" always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
        # required to be able to read Authorization header in frontend
        #add_header 'Access-Control-Expose-Headers' 'Authorization' always;
}

if ($request_method = 'OPTIONS') {
        # Tell client that this pre-flight info is valid for 20 days
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
}

nginx的反向代理功能具体示例

实验拓扑图:
技术分享图片
现在我们要求nginx为后端的三台服务器提供反向代理功能:
其中图片服务器单独定义为一个location作为调度,要求配置缓存功能,另外两台web服务器组成负载均衡模式,一主一备,并作健康状态检查,同时在web服务器上配置日志功能,记录真实的客户端ip地址。

首先我们来准备实验的基础环境:

反向代理服务器两台网卡分别连接互联网以及跟后端的upstream server通信

反向代理服务器端配置:
yum install -y nginx    //安装nginx服务
systemctl start nginx
systemctl enable nginx //设置开机自动启动nginx服务
vim /etc/selinux/config
SELINUX=disabled    //关闭selinux功能
systemctl stop firewalld   //关闭防火墙
打开反向代理服务器的路由转发功能
编辑/etc/sysctl.conf文件
添加net.ipv4.ip_forward=1
sysctl -p重读文件
后端upstream server服务器配置:
yum install -y httpd  //三台服务器安装httpd服务,其中一台作为图片服务器使用
vim /etc/selinux/config
SELINUX=disabled    //关闭selinux功能
systemctl stop firewalld   //关闭防火墙

配置图片服务器

编辑反向代理服务器的主配置文件,在location中定义

location ~*  .(jpg|png|gif)$  {
                proxy_pass http://192.168.153.129;     //所有图片格式的资源请求发布发送的192.168.153.129这台主机上面
                }

配置缓存功能

在主配置文件的http字段中定义定义缓存功能,并在location中调度使用
proxy_cache_path  /cache/nginx  levels=1:1  keys_zone=mycache:32m
location ~*  .(jpg|png|gif)$  {
                proxy_pass http://192.168.153.129;     
                proxy_cache mycache;   //调用缓存名称
                proxy_cache_valid   200  206  301 302 10d;//响应结果为200,206,301,302缓存10天
                proxy_cache_valid   any  1m;   //其它响应结果全部缓存1分钟
                proxy_cache_use_stale error timeout;  //结果返回错误或者请求响应超时则返回给客户端陈旧的缓存信息
                }
创建缓存目录
mkdir  /cache/nginx
更改文件属主属组
chown -R    nginx:nginx  /cache/nginx  
重新启动服务
systemctl restart nginx

技术分享图片
在upstream server服务器中启动httpd服务并设置开机自动启动
在/var/www/html/目录中上传一张1.jpg格式的图片
使用客户端请求资源验证结果

技术分享图片
接下来我们查看/cache/nginx目录下面是否有缓存信息生成
技术分享图片

这里我们要特别注意:
有时候配置了缓存功能,在客户端请求之后反向代理服务器的缓存目录之下没有生成缓存文件有可能是因为http响应头(http headers),如果出现两个以上的http header,会导致缓存失败,我们可以在location字段中使用
proxy_ignore_headers Set-Cookie Cache-Control;  来忽略响应报头
还有一种可能就是没有关闭selinux,导致nginx进程在调用缓存目录时失败。关闭selinux即可。

接下来我们配置两台web服务器,为了验证upstream模块的负载均衡共能,我们这里将两台服务器的web测试界面设置为不同的内容。

首先编辑反向代理服务器的主配置文件
在配置文件中的http字段中定义upstream

upstream upservers {
            server 192.168.153.130 ;
            server 192.168.153.131 ;
            }
在location中进行调度
location /forum {                    //这里我们使用url重定向来定义
            proxy_pass http://upservers/;
         }

技术分享图片
使用客户端验证一下
技术分享图片
技术分享图片
继续配置web服务器主从,并对其做健康状态检查,同时在web服务器上配置日志功能,记录真实的客户端ip地址。

upstream upservers {
            server 192.168.153.130  max_fails=2 fail_timeout=1;  //健康状态检查同下
            server 192.168.153.131 backup  max_fails=2 fail_timeout=1; //定义131这台服务器为备用服务器,对其做健康状态检查单位周期为1的时间内,达到2次请求失败则标记为节点不可用,并等待下一个周期的检查,判断其是否恢复正常。
            }

技术分享图片
我们手动关闭主服务器的http服务,观察备用服务器是否正常工作,然后修改主服务器的测试页面并启动服务,模拟一个热备升级的过程,location配置不变
登陆主服务器进行配置
systemctl stop httpd
使用客户端请求发现无论怎样刷新只能请求备用服务器的测试页面

技术分享图片
将主服务器测试页面修改后重启服务,使用客户端请求
技术分享图片
因为两台服务器为主备关系所以当主服务器正常运行后,备用服务器则处于待机状态。

最后配置web服务的日志收集功能
这里要想在后端的upstream server中查看客户端的真实ip,则需要在反向代理服务器的主配置文件的location字段中使用两个参数

 proxy_set_header Host $host;    //获取客户端的主机名
 proxy_set_header C-Real-IP $remote_addr;  //获取客户端的ip地址

定义在location中

 location /forum/  {
        proxy_pass http://upservers/ ;
        proxy_set_header Host $host;
        proxy_set_header C-Real-IP $remote_addr;
        }

编辑upstream server后端服务器日志服务的配置文件
将反向代理服务器定义的C-Real-IP变量名填写到LogFormat字段第一个%后面,重启服务,另一台服务器相同配置

技术分享图片
使用客户端请求然后查看一下日志记录文件
技术分享图片
因为我这里使用的vmware的nat网络功能,所以这里的客户端地址显示的vmware网关的地址

问题遗留:在实际生产环境中客户端大部分使用的SNAT进行上网,可能一个公网IP后端有很多个客户端共同使用。这时我们可以基于session会话绑定来实现客户端的信息记录,具体配置将在下一小节说明。

以上是关于ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持的主要内容,如果未能解决你的问题,请参考以下文章

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

宝塔面板Nginx反向代理解决跨域问题

nginx的反向代理功能具体示例

nginx代理api