什么是Nginx
Nginx是一个高性能的HTTP和反向代理服务器和负载均衡器,顾名思义nginx常用的功能就是反向代理以及负载均衡。
在后台开发中Nginx经常和服务器集群一起使用,用轮询、权重、ip_hash等策略将请求分发给服务器
在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。
正向代理与反向代理
很多同学估计都用过或者见到过代理服务器这些字样,其实简单理解就是将处理请求的到达
-
正向代理
站在用户的角度看,正向代理是用户已经知道要访问哪个IP地址(域名),这个请求发给代理服务器,代理服务器来帮助用户访问,此时隐藏了用户的信息,因为请求这时就是从代理服务器发出的,就像所说的科学上网,大多数科学上网其实就是利用了正向代理 -
反向代理
反向代理从用户角度出发,就是用户不知道访问到的真正服务器,但是用户可以访问代理服务器,由代理服务器来分发用户的请求到指定的服务器,并将结果返回给用户,这个过程中,用户不需要知道最终访问的服务器,只要知道反向代理服务器的Ip即可
这里用知乎@阿笠硕士的答案来加深理解 https://www.zhihu.com/question/24723688
负载均衡
既然是分发请求,那么就有相应的策略,所谓负载均衡就是使用什么策略来实现请求的分发,比如一个有3台服务器的集群,使用轮询的策略来做负载均衡,有3个请求过来了,那么一个请求分发给一个服务器,相当于一台一个,第4个请求过来时,那么会重新将请求分给第一台服务器,依次进行
Nginx环境搭建
通过 http://nginx.org/en/download.html 下载一个nginx服务包,我配置的是Linux版本,将tar包传送到Linux系统下就可以开始搭建环境了,因为Nginx是用C写的,所以需要编译,可以先执行yum -y install gcc gcc-c++ autoconf automake make
安装gcc
步骤:
- 进行解压安装:tar -zxvf nginx-1.6.3.tar.gz -C [指定目录] /usr/local
- 下载所需要的依赖库文件:
yum install pcre -y
yum install pcre-devel -y
yum install zlib -y
yum install zlib-devel -y - 进到解压目录,进行configure配置,查看是否报错
cd nginx-1.6.3
./configure --prefix=/usr/local/nginx - 在该目录下编译安装:make && make install (安装完之后,在上一级目录可以看到一个nginx文件夹)
- 在 /usr/local/nginx目录下,可以看到如下4个目录
conf配置文件,html网页文件,logs日志文件,sbin主要二进制程序可执行文件 - 启动命令:/usr/local/nginx/sbin/nginx
关闭命令:/usr/local/nginx/sbin/nginx -s stop
重启命令:/usr/local/nginx/sbin/nginx -s reload - 可以使用netstat -ano | grep 80 查看端口,也可以使用 ps -ef | grep nginx查看进程
- 访问浏览器:nginx默认是监听80端口(访问Linux主机的地址,能看到欢迎页面就说明没问题)
注意:如果出现这个错误:./configure: error: C compiler cc is not found
执行这个命令:yum -y install gcc gcc-c++ autoconf automake make
Nginx配置文件
在nginx文件中的conf文件夹中,有一个nginx.conf文件,这里对我们的nginx进行配置,nginx启动的时候会加载这个配置文件,所以每次修改完这个文件,就需要重启nginx
关于nginx.conf文件的详细配置可以参考这一篇 http://www.nginx.cn/76.html ,这里主要讲讲一些常见的配置
server节点
#配置主机,基于域名、ip和端口
server {
#监听端口(实际开发一般不改)
listen 80;
#监听域名(开发中配置成服务所在的域名)
server_name localhost;
#charset koi8-r;
#nginx访问日志放在logs/host.access.log下,并且使用main格式
#access_log logs/host.access.log main;
#返回的相应文件地址
location / {
#返回根路径地址(相对路径:相对于/usr/local/nginx/)
root html;
#默认访问文件(如果只访问域名,默认访问/index)
index index.html index.htm;
}
}
可以在http节点下配置多个server节点,这几个server同时起作用
log_format日志节点
#日志文件输出格式 这个位置相于全局设置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#请求日志保存位置(在server外面,是全局配置)
access_log logs/access.log main;
- 日志的切分
nginx的日志如果全部记录到一个文件中,将会导致日志文件太大,从而不好查询日志,所以利用Linux的定时器执行shell将日志按照时/天拆分
- 首先编写shell脚本,名为backuplog.sh
#!/bin/sh
# 定义变量BASE_DIR和BASE_FILE_NAME
BASE_DIR=/usr/local/nginx
BASE_FILE_NAME=kiring.cn.access.log
# 定义变量CURRENT_PATH和BAK_PATH
CURRENT_PATH=$BASE_DIR/logs
BAK_PATH=$BASE_DIR/datalogs
# 定义变量CURRENT_FILE和BAK_TIME和BAK_FILE
CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
# 将文件移动到指定目录
mv $CURRENT_FILE $BAK_FILE
# 重启nginx的日志服务
$BASE_DIR/sbin/nginx -s reopen
- 定时任务对脚本进行调度:
crontab -e
在接下来的VI编辑器配置
- */1 * * * sh /usr/local/nginx/sbin/backuplog.sh
location
可以在location实现请求资源匹配
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
例如:
# $表示以什么结尾
location ~*.jsp$ {
root html;
index index.jsp.html index.htm;
}
表示如果请求以jsp结尾的资源时,都会执行这个location的内容
- 在location可以配置一些语法如(if(条件为: =~~*)、return、break、rewrite)
location / {
if ($remote_addr = 192.168.122.1) {
return 401;
}
root html;
index index.jsp.html index.htm;
}
这里是判段访问的ip地址是否是192.168.122.1,是的话直接返回401
location /goods {
rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
root wolfcode.cn;
index index.html;
}
这段是将以访问goods-(5位数以内的数字).html的资源重写成访问/goods-ctrl.html资源
利用rewrite可以实现伪静态的功能,就是请求一个html页面,实际上是另外请求到后台的动态资源,因为html比较好爬取,利用rewite可以让搜索引擎更快更好的找到自己
反向代理配置
配置反向代理:proxy_pass url -> 将请求代理给一个指定服务器
配置反向代理的请求头:proxy_set_header -> 设置代理请求的请求头
如果服务器想要获得真正的用户端的ip地址,取消在nginx转发的请求头中利用$remote_addr
配置这个请求头,$remote_addr
是nginx的其中一个全局常量
例如:
location ~* \.jsp$ {
proxy_pass http://192.168.116.110:8080;
proxy_set_header X-real-ip $remote_addr;
}
以jsp结尾的资源请求都将被转发到192.168.116.110这个ip下获取
负载均衡 upstream节点
#设定负载均衡的服务器列表
#upstream myproject {
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}
upstream tomcat_server {
server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;
}
location ~* \.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header X-real-ip $remote_addr;
}
以轮询的方式平均分配请求,如果某一台的服务器性能更好,可以设置weight大小,如果需要使用Ip_Hash,可以在upstream的第一行配置ip_hash
如:
upstream tomcat_server {
server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;
}