第一次写这种技术性的文章,有哪些说的不好或者不对的地方,麻烦各位大大指点了...
因为公司需要开发一个高并发的项目,所以我就开始研究这个Nginx服务器。后来因为老出问题,通过Nginx一直访问不到服务器,项目紧急(因为公司只有我一个搞后台的....),所以暂时就放了一段时间。
后来公司招了个写H5的前端,在通过ajax访问服务器的时候老出现跨域问题,type改成jsonp之后又出现了一个Unknown token的错误。后来前端问了一下以前的同事,说是他们在测试的时候后台都会帮忙搭一个Nginx服务器,这样ajax访问的就是本地的Nginx服务器,再通过Nginx进行转发,将请求发送给真正的后台服务器,这样就避免的跨域的问题。于是我就开始了Nginx的搭建.....
看了一些别人的文章和博客,终于的入了个门,就把我搭建Nginx服务器中过程记录一下吧。
先了解一下什么是Nginx
(下面的内容来自百度百科)
Nginx("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
说到反向代理,tomcat结合nginx使用小结这篇文章做了很好的解释
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
这里讲得很直白。反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。这样说,其实nginx完成的就是这样的工作。我们让nginx监听一个端口,譬如80端口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完成后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回,这里,我们会以为是nginx进行了处理,但实际上进行处理的是tomcat。
我现在用的是nginx-1.6.1版本的,下面附上链接
下载地址:http://nginx.org/en/download.html
当下载完成以后,解压到文件夹下,直接运行nginx.exe,就可以在任务管理器中看到Nginx服务已经启动了
附上一些Nginx的命令,在Nginx目录下shift+右键,在此处打开命令窗口,就可以按照需要输入以下命令
也可在cmd中通过命令进行启停启动nginx:
start nginx //运行nginx
nginx -s stop // 停止nginx
nginx -s reload // 重新加载配置文件(如修改配置文件后,可通过该命令重新加载)
nginx -s quit // 退出nginx
nginx -v //可查nginx版本
很多文章中写到运行了之后直接在浏览器中输入localhost或者127.0.0.1就会直接弹出Nginx欢迎页,但是我的就是一直没有弹出了。这个时候打开\nginx-1.6.3\conf\nginx.conf文件,看到
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
现在listen监听的是80端口,我也尝试过在浏览器中输入127.0.0.1:80,结果也是一样,没有产生任何变化。
后来我修改了端口号,将80改为8080(这个端口号不要和tomcat服务器的端口号冲突了,否则要么是Nginx启动不了,要么tomcat启动不了),终于是在浏览器中输入127.0.0.1:8080之后,终于迎来了久违的Nginx欢迎页...
Nginx中主要的配置就在nginx.conf文件当中,主要的一些属性的解释就在下面了
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。(应该是访问Nginx的ip,不包含端口号,listen是访问对应的端口号)
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
在了解这些属性后,就可以对Nginx服务器进行配置了
location这个属性上面也说了,是对路径的匹配和过滤比如
location ~ \.(html|js|css|png|gif)$ {
root D:/software/developerTools/server/apache-tomcat-7.0.8/webapps/ROOT;
}
这个是当后缀为.html、.css、.js、.png、.gif结尾的请求,会在root路径中去找对应的资源
那么如何将它和tomcat关联起来呢?看下面的配置
location / {
proxy_pass http://localhost:8081;
}
这个配置是匹配所有的url,当碰到url请求Nginx服务器的时候就会进入到这个配置当中。
proxy_pass,它表示代理路径,相当于转发,转发到指定url,之前将server_name和listen分别改为了127.0.0.1和8080,在进行这个配置之后,在浏览器中输入127.0.0.1:8080就会弹出tomcat的主页了。
但是这里有个问题,当配置第一个location ~ \.(html|js|css|png|gif)$之后,在进行这个代理路径的配置,在请求127.0.0.1:8080会出现没有图片没有js没有css的一个"裸"网页。
如果还有的话,说明是缓存问题。。。清一下缓存就行了,然后nginx -s reload就可以了
因为请求的url中会把关于这个网页所有相关的css,js,图片资源都会请求下来,但是这个时候你进行location ~ \.(html|js|css|png|gif)$ 文件资源路径的匹配,所以它会在这个路径下去找资源,这自然就是找不到的,所以,就会出现一个"裸"的页面...这个一定要注意了。
还有,任何开发工具或者项目,万万不要放到中文路径下(有经验的开发者肯定会注意这一点的),在我把Nginx搭建好了之后,发给前端的同事,结果死活启动不了,他装得win10的系统,我对win10又有点偏见,总觉得是系统的问题,后来网上查了一下,上面就说要么端口号被占用了,要么放在了中文路径下,我问前端的同事Nginx放哪了,一看路径.............
结果换了个路径,项目成功启动。同事的ajax的跨域问题也解决了。
因为是第一次写,可能写的不好也不够仔细,有什么不懂的地方,可以问我,反正我也是才入门,可能也不是很懂,但是可以多交流交流嘛,人多力量大喽.........
最后推荐一些对我搭建Nginx有帮助的文章