windows上 nginx 配置代理服务,配置多域名,以及最简单实现跨域配置

Nginx,不用多说啦,大家都熟悉的不能再熟悉了,它是一款轻量级的高性能Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,最近在本地研究将nginx和resin配合使用,使服务性能达到最高,在配置过程中主要涉及到单域名配置代理服务,以及配置多域名代理服务,以及最简单实现跨域配置(当然什么负载均衡,动静分离,静态资源代理这些就不说啦,直接放到代码里去了,有注释)。

在正式上线前,先在本地window环境下配置跑起来测试下配置是否正确,所以这次就以windows 版的nginx做测试了,正式上线后,配置也就相差无几了。

一、nginx下载、安装及启动 下载地址:nginx 下载最新版的nginx for windows版本,下载完成后,解压做zip包到本地磁盘上,例如:D:\hwy\nginx-1.8.0 启动:

1、D:\hwy\nginx-1.8.0\start nginx(推荐)
2、D:\hwy\nginx-1.8.0\nginx.exe

注意:推荐使用第一种方式启动,因为第二种方式会使你的cmd窗口一直处于运行状态,没法输入其他命令了,而第一种已后台的方式运行,可以继续输入其他命令。 停止:

D:\hwy\nginx-1.8.0\nginx -s stop

重启:

D:\hwy\nginx-1.8.0\nginx -s reload

二、配置单个server代理服务 为了模拟域名的形式访问本地服务,我们修改windows的host文件,新增

127.0.0.1 a.test.com
127.0.0.1 b.test.com #(待会配置多域名时使用)

在D:\hwy\nginx-1.8.0\conf目录新增一个nginx-resin-a.conf,基本配置代码如下:

server{
        listen 80;
        server_name a.test.com;
        index index.html index.htm;
        root D:/hwy/aTest/src/main/webapp/;
        #配置首页精确匹配
        location = / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://aTestServer;
        }
        #配置首页
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://aTestServer;
        }
        #动态页面交给http://127.0.0.1:8080,也即我们之前在nginx.conf定义的upstream aTestServer 均衡
        location ~ .*\.(php|jsp|cgi)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://aTestServer;
        }
        #配置静态资源前缀匹配
        location ~ ^/(fileUpload|doc)/ {
            root D:/hwy/www/aTest/;
            access_log off;
            expires 4d;
        }
        #配置Nginx动静分离,定义的静态页面直接从项目指定目录读取。
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
            access_log off;
            expires 30d;
        }

        #定义Nginx输出日志的路径
        access_log D:/hwy/logs/aTest/access.log main;
        error_log D:/hwy/logs/aTest/error.log crit;
    }

将nginx-resin-a.conf引入到nginx.conf文件里面,nginx.conf如下:

#user  nobody;
#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes  4;

#错误日志存放路径  
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#指定pid存放文件 
pid       logs/nginx.pid;          

worker_rlimit_nofile 51200;

events {
    #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定。  
    #use epoll; 
    #允许最大连接数  
    worker_connections  51200;
}

http {
    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"';

    #access_log  D:/hwy/nginx-1.8.0/logs/access.log  main;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;

    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay     on;

    #keepalive_timeout  0;
    keepalive_timeout  120;

    upstream aTestServer {
        server 127.0.0.1:8080;
    }

    include  nginx-resin-a.conf;
}

好了,经过上边的配置之后,我们启动nginx以及本地你的aTest服务resin,访问下http://a.test.com看看效果吧!

三、配置多域名 上边配置了一个aTest的服务的代理,如果我们在服务器上边要运行多个服务,比如bTest服务,达到的效果是,通过http://a.test.com访问aTest站点服务,通过http://b.test.com访问bTest站点服务,其实也很简单的,只需要在引入一个bTest的server配置即可。 在D:\hwy\nginx-1.8.0\conf目录新增一个nginx-resin-b.conf,基本配置代码如下:

server{
        listen 80;
        server_name b.test.com;
        index index.html index.htm;
        root D:/hwy/bTest/src/main/webapp/;
        #配置首页精确匹配
        location = / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://bTestServer;
        }
        #配置首页
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://bTestServer;
        }
        #动态页面交给http://127.0.0.1:8090,也即我们之前在nginx.conf定义的upstream bTestServer 均衡
        location ~ .*\.(php|jsp|cgi)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://bTestServer;
        }
        #配置静态资源前缀匹配
        location ~ ^/(fileUpload|doc)/ {
            root D:/hwy/www/bTest/;
            access_log off;
            expires 4d;
        }
        #配置Nginx动静分离,定义的静态页面直接从项目指定目录读取。
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
            access_log off;
            expires 30d;
        }

        #定义Nginx输出日志的路径
        access_log D:/hwy/logs/bTest/access.log main;
        error_log D:/hwy/logs/bTest/error.log crit;
    }

然后我们只需要将nginx-resin-b.conf引入到nginx.conf配置文件中即可,在nginx.conf的http最后边增加

    upstream bTestServer {
        server 127.0.0.1:8090;
    }

    include  nginx-resin-b.conf;

好了,现在重启nginx,并启动本地你的bTest服务resin,分别访问下http://a.test.comhttp://b.test.com看看是不是都到达指定的站点服务上去啦!

四、跨域配置 好了,现在我们有了两个不同域名指定的项目了,但是现在bTest服务中有些接口数据请求需要由aTest来提供,bTest通过ajax请求aTest的接口数据,这个时候,如果直接请求,肯定是会涉及到跨域的问题了,浏览器是不允许的。现在我们可以通过nginx反向代理来实现跨域请求。

实例一: 在nginx-resin-b.conf配置中增加如下:

    location /api {
        rewrite ^.+api/?(.*)$ /api/$1 break;
        proxy_pass http://aTestServer;
    }

注意:这里意思是将所有http://b.test.com/api/xxx类似的请求直接rewrite到http://a.test.com/api/xxx上边去啦!

实例二: 在nginx-resin-b.conf配置中增加如下:

    location /baidu {
        rewrite ^.+baidu/?(.*)$ /$1 break;
        proxy_pass http://www.baidu.com;
    }

注意:这里我们就把baidu网站整个搬到我们的127.0.0.1:8080/baidu/目录下了,这样我们访问的时候,直接通过/baidu/xxx来请求百度的数据啦!

简而言之,nginx 是通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。

对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器,并通过rewrite命令重新指向真实的请求地址。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

简单说,nginx服务器欺骗了浏览器,让它认为这是同源调用,从而解决了浏览器的跨域问题。又通过重写url,欺骗了真实的服务器,让它以为这个http请求是直接来自与用户浏览器的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏白驹过隙

Redis - 介绍及安装

29890
来自专栏软件测试经验与教训

session与cookie的区别详解

由于HTTP协议是无状态的,在WEB系统中,怎么识别请求来自于哪里呢?是哪一个用户发起的请求呢?

13810
来自专栏Script Boy (CN-SIMO)

PowerShell:因为在此系统上禁止运行脚本

在安装chocolatey(官网)的时候,不能运行chocolateyInstall.pal脚本文件。 ? 查阅资料后,得出如下解决办法: 首次在计算机上启动 ...

46100
来自专栏C/C++基础

Linux系统相关配置

为了使程序在崩溃时产生core文件,我们经常在终端使用命令ulimit -c unlimited 来设置。但是当前设置只能在当前会话有效,当关闭当前会话,打开新...

10320
来自专栏编程

每日一学之socket编程(一)

图片来自...

20090
来自专栏惨绿少年

linux中必会的目录

第1章 find命令扩展 1.1 方法一 |xargs 通过|xargs将前面命令的执行结果传给后面。 [root@znix ~]# find /oldboy/...

31400
来自专栏实战docker

Docker下,极速体验编译pinpoint1.6.x分支

pinpoint是一款优秀的APM监控工具(Application Performance Management),用java编写的,用于分布式系统的监控和调用...

376100
来自专栏运维小白

10.21 firewalld关于zone的操作

Linux防火墙-firewalld firewall-cmd --set-default-zone=work //设定默认zone firewall-cmd ...

230100
来自专栏.NET开发那点事

关于WCF服务在高并发情况下报目标积极拒绝的异常处理

最近弄了个wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误。一开始以为服务停止了,上服务器检查目标服务好好的活着。于是开始查原因。 一般来说目标积...

24460
来自专栏实战docker

Docker下HBase学习,三部曲之二:集群HBase搭建

上一章《Docker下HBase学习,三部曲之一:极速体验》我们快速体验了单机版HBase提供的基础服务,接下来我们实战HBase集群环境的搭建。 集群规划 首...

66080

扫码关注云+社区

领取腾讯云代金券