作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc。
![](https://img.haomeiwen.com/i3480018/7d53bfba470f12db..jpg)
Nginx是什么?
百科上是这样解释的:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。
反向代理?该如何理解呢?
举一个很明显的例子,在进行开发的时候,通常会把项目(ibooker)发布到tomcat,假如项目首页是index.jsp,tomcat端口号是8080,那么要访问tomcat中ibooker项目首页,就要在浏览器上输入:http://localhost:8080/ibooker/index.jsp。
但是一般网站访问都是没有端口号,类似:http://localhost/直接通过域名访问首页。
这样问题就来了,http协议访问时80端口,tomcat访问时8080端口,怎么才能做到不输入端口号就能访问tomcat上发布的项目呢?这个问题的关键点就在80端口,如果在访问80端口的时候就能够直接去访问8080端口不就可以实现了吗,那么如何监听80端口呢?
答案就是Nginx,Nginx作为反向代理就是把所有请求交给它来处理,之后转发出去。
那么具体的该如何实现呢?
1、安装
去Nginx官网下载相应的安装文件,本例中是Windows环境,下载的是nginx-1.12.1.zip文件。在Windows下安装Nginx其实非常简单,只需要把zip文件解压即可。
Nginx文件目录结构图
![](https://img.haomeiwen.com/i3480018/fa03e68065f4fd14..jpg)
其中conf是用来放Nginx的配置文件,logs日志文件,nginx.exe是Nginx的应用程序可以通过该文件直接启动或操作Nginx。
2、配置
Nginx安装完后,就是配置文件了。nginx.conf为Nginx的基本配置文件,它在conf文件夹下。
nginx.conf有几个重要的参数要注意:
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里。
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
在这里,最关键的就是对http的相关配置:
#Nginx所用用户和组,window下不指定
#user nobody;
#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes 2;
#错误日志存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#指定pid存放文件
pid logs/nginx.pid;
events {
#使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
#use epoll;
#允许最大连接数
worker_connections 2048;
}
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"';
#长连接超时时间,单位是秒
keepalive_timeout 65;
# 默认访问日志路径
access_log logs/access.log;
#负载均衡相关配置
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
#上传文件大小限制
client_header_buffer_size 1k;
#设定请求缓
large_client_header_buffers 4 4k;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
sendfile on;
#防止网络阻塞
tcp_nopush on;
#防止网络阻塞
tcp_nodelay on;
#启动数据压缩
include gzip.conf;
#以下是反向代理的配置,可选。
include proxy.conf;
#upstream localhost {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
# server localhost:8080 weight=1;
#}
server {
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name localhost;
#默认编码
charset utf-8;
#访问文件根目录
root E:/MyEclipse/apache-tomcat-7.0.72-windows-x64/apache-tomcat-7.0.72/webapps;
#404页面设置
error_page 404 /404.html;
#50X页面设置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
#此部分主要是dwr的js有写是服务器动态生成的,不能交给nginx处理,这样会出现404,需要单独处理并交给服务器处理。
location /ibooker/dwr/ {
proxy_pass http://localhost:8080/ibooker/dwr/;
}
#本地动静分离反向代理配置(静)
#其他的静态文件处理dwr的都交给nginx处理
location ~ \.(htm|html|gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
access_log off;
expires 24h;
}
#本地动静分离反向代理配置(动)
location /ibooker/ {
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
proxy_pass http://localhost:8080/ibooker/;
}
#访问根目录下的路径也就是webapp,默认跳转到ibooker项目的路径下,也就是跳转到上面的路径
location / {
rewrite (.*)$ /ibooker$1 permanent;
}
}
}
在上面的配置文件中提到gzip.conf和proxy.conf。所以要将这两个文件添加到conf文件夹下。
gzip.conf:数据压缩
#开启gzip压缩输出
gzip on;
#最小压缩文件大小
gzip_min_length 1024;
#压缩缓冲区
gzip_buffers 4 8k;
#压缩等级
gzip_comp_level 9;
前端是squid的情况下要加此参数,否则squid上不缓存gzip文件
gzip_proxied any;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types application/xml application/javascript application/x-javascript application/atom+xml application/rss+xml;
gzip_types text/css text/javascript text/js text/plain text/xml;
proxy.conf:反向代理的配置
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,
client_body_buffer_size 128k;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 300;
#后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 300;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 300;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
到这里可以说基本上都已经完成了,最后通过CMD命令启动Nginx即可。
注意:Nginx的相关命令,需要进入Nginx的安装目录才行,命令是通过nginx.exe来执行。
开启Nginx:
start nginx
关闭Nginx:
nginx -s stop
或
nginx -s quit
重新载入Nginx:
nginx -s reload
通常在Windows环境下使用Nginx可能会发生一些小的错误:
1、路径错误
例如:当设置root C:\Tomcat\Tomcat 8.5\webapps。启动Nginx时候会报如下错误:
nginx: [emerg] invalid number of arguments in "root" directive in e/nginx1.12.1/conf/nginx.conf:41
报这种错误的原因是:文件路径不能带空格,所以可以改成root "C:\Tomcat\Tomcat 8.5\webapps"。添加双引号。
这时候再次启动还是会报同样的错误:
这次报错的原因是:文件路径中的\错误,所以要改成root "C:/Tomcat/Tomcat 8.5/webapps"。这样再次启动就不会报错了。
2、创建文件失败
例如:当在nginx.conf文件中设置pid logs/nginx.pid;启动Nginx,这时候可能会报如下错误:
nginx: [error] CreateFile() "E:\nginx\nginx-1.12.1/logs/nginx.pid" failed
这时候可以通过手动创建文件的方式解决这个问题:
CMD输入:nginx -c conf/nginx.conf运行即可。
解决了所有问题之后,开启Nginx和tomcat,在浏览器上输入http://localhost/,这时候你会发现网页会自动跳转到http://localhost/ibooker/。
那如何自动访问到index.jsp文件呢?
其实我们只需要在工程文件中找到web.xml文件,设置:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
之后再向浏览器输入http://localhost/,此时就会自动跳转到index.jsp页面。
注意:Nginx在linux系统下才能发挥出高性能。
![](https://img.haomeiwen.com/i3480018/643772935e3bada2..jpg)
网友评论