博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows上 nginx 配置代理服务,配置多域名,以及最简单实现跨域配置
阅读量:6196 次
发布时间:2019-06-21

本文共 6031 字,大约阅读时间需要 20 分钟。

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

在正式上线前,先在本地window环境下配置跑起来测试下配置是否正确,所以这次就以windows 版的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
  • 1
  • 2

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

停止:

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

重启:

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

二、配置单个server代理服务 

为了模拟域名的形式访问本地服务,我们修改windows的host文件,新增

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

在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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

将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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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

三、配置多域名 

上边配置了一个aTest的服务的代理,如果我们在服务器上边要运行多个服务,比如bTest服务,达到的效果是,通过访问aTest站点服务,通过访问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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

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

upstream bTestServer {        server 127.0.0.1:8090;    }    include nginx-resin-b.conf;
  • 1
  • 2
  • 3
  • 4
  • 5

好了,现在重启nginx,并启动本地你的bTest服务resin,分别访问下和看看是不是都到达指定的站点服务上去啦!

四、跨域配置 

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

实例一: 

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

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

注意:这里意思是将所有类似的请求直接rewrite到上边去啦!

实例二: 

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

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

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

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

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

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

转载于:https://www.cnblogs.com/liu2-/p/7744398.html

你可能感兴趣的文章
ActivityGroup 实现tabHost
查看>>
桌面应用程序员简单尝试Rich JavaScript Application
查看>>
SQL Server R2 地图报表制作(一)
查看>>
[转]信息系统项目管理师考试论文写作技巧
查看>>
NYOJ488素数环
查看>>
android adt各版本下载
查看>>
strtotime用法案例
查看>>
OFBiz 的Party PartyGroup主要关系
查看>>
我的MVVM框架 v2发布
查看>>
2011-03-29 14:53 ActiveX控件中接收并处理Windows消息的问题
查看>>
VC6下获取硬盘序列号
查看>>
ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)
查看>>
修改和美化安卓系统的第一步~从认识APK开始(APK编译、签名、zipalign优化及APKTOOL的使用)...
查看>>
fx-games
查看>>
软件相关零散知识点
查看>>
分析函数总结
查看>>
分享:我的2012
查看>>
x264简介
查看>>
分享:一个支持并发, 支持异步/同步, 支持http/https, 支持续传的avhttp库
查看>>
Android学习笔记28:对话框Dialog控件的使用
查看>>