nginx的特点
支持高并发,并且资源消耗小
可以做http反向代理及负载均衡,内置对RS节点的健康检查功能,如有服务器宕机
具备squid等专业缓存软件的功能
支持异步网络IO事件模型epoll
nginx主要企业功能应用
作为web服务软件
- 1运行静态网站
- 2结合FastCGI运行PHP动态程序(使用fastcgi_pass方式)
- 3结合Tomcat/resin 支持JAVA动态程序(使用proxy_pass方式)
反向代理与负载均衡服务
前端业务数据缓存服务
正向代理与反向代理
- 概念
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。 - 区别
正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;而反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器。
正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见
安装nginx
- 1 安装依赖
yum install pcre pcre-devel gcc gcc-c++ openssl openssl-devel -y - 2 可切换国内镜像源
mirrors.aliyun.com,选择相应的版点击help,复制后代码运行。 例:
mv /etc/yum.repos.d/CentOS-Base.repo \/etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
- 3 创建用户及相关文件夹
useradd www -s /sbin/nologin -M
mkdir /home/tools
wget https://nginx.org/download/nginx-1.8.1.tar.gz
tar xf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --user=www --group=www \
--with-http-stub_status_module \ #状态模块
--with-http_ssl_module \ #https
--prefix=/app/nginx-1.8.1 #安装目录
make && make install
ln -s /app/nginx-1.8.1. /app/nginx
- 4 开启关闭查看命令
/app/nginx/sbin/nginx -V #查看版本信息
/app/nginx/sbin/nginx -t #测试配置文件
/app/nginx/sbin/nginx #启动nginx
/app/nginx/sbin/nginx -s stop #停止
/app/nginx/sbin/nginx -s reload #优雅重启
/app/nginx/conf/nginx.conf #主配置文件
/app/nginx/logs/error.conf #错误日志
netstat lntup |grep 80 #查看进程
killall nginx 杀掉所有nginx 进程
egrep -v "^$|#" nginx.conf.default >nginx.conf #清理配置文件中的注释和空行
- 5 配置文件
worker_processes 1; #进程数,一般等于cpu核数
events {
worker_connections 1024; #并发请求数
}
http {
include mime.types; #媒体类型
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/*.conf; #加载其它conf文件,以免主配置文件过于杂乱
server {
listen 80; #监听端口
server_name localhost; #域名,可添加多个别名(用于监控),用空格分开
location / {
root html; #网站目录
index index.html index.htm; #首页文件
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
- 6 虚拟主机
基于域名和端口的虚拟主机,只需在nginx.conf的http块内添加多个server块,先找端口,再匹配$http_host
server {
listen 80; listen 81; #基于端口
server_name www.aaa.com; www.bbb.com; #基于域名
location / {
root html; #网站目录
index index.html index.htm; #首页文件
}
}
- 7 状态模块
cat /app/nginx/extra/status.conf <<EOF
server {
listen 80;
server_name status.aaa.com;
location / {
stub.status on;
access_log off;
}
}
EOF - 8 日志
error_log logs/error.log error;#日志类型 目录 级别
access_log logs/access.log main # 日志类型 目录 格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
日志切割
cd /app/nginx/logs
/bin/mv access.log access_${date +%F}.log
/app/nginx/sbin/nginx -s reload
crontab -e
59 23 * * * /tools/cut.sh
- 9 location配置
rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里
=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~ 开头表示uri以某个常规字符串开头,不是正则匹配
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到
顺序优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
实际使用案例
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
- 10 rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。
常用正则
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
( ) :反向引用$1 $2
- 11 rewrite 实例
要求:/images/bla_500x400.jpg => /resizer/bla.jpg?width=500&height=400地址
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3 last;
要求:/images/ef/uh7b3/test.png => /data?file=test.png
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
if ($host ~* (.*)\.domain\.com) {
set $sub_name $1;
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}
要求:/123456/xxxx => /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
要求:设定nginx在用户使用ie的使用重定向到/nginx-ie目录
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
要求:当用户访问任何内容时都跳转到www.aaa.com
rewrite ^/(.*) http://www.aaa.com/$1 permanent
要求:bbs.aaa.com => www.aaa.com/bbs/index
if ( $http_host ~* "^(.*)\.aaa\.com$") {
set $domain $1 ;
rewrite ^(.*) http://www.aaa.com/$domain/index.html break ;
}
要求:www.aaa.com/bbs/xxx.html => bbs.aaa.com/xxx.html
rewrite ^/bbs/(.*) http://bbs.aaa.com/$1 break ;
网友评论