一、Nginx概述
1、什么是nginx
Nginx是一款web服务器,是Apache的改良款,在性能上,nginx占用系统资源更少,能支持更多的并发连接(特别是静态小文件场景),达到更高的访问效率;还可以作为反向代理负载均衡及缓存服务使用,在安装配置上,nginx更为方便、简单、灵活。
nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件。
nginx具有高并发(特别是静态资源),占用系统资源少的特性,且功能丰富。
常用的有: Apache Nginx(这两个不用数据库处理静态数据的web服务器) Tomcat(JAVA代码的web容器,一般都是小企业用,运行功能比较少,只能处理小的JAVA) weblogic (政府用的处理JAVA)jboss resin (这两个都是大企业用的,重型JAVA容器)
2、Nginx的重要特性
·支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
·资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
(对系统资源占用很低)
·可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
·具备Squid等专业缓存软件等的缓存功能
·支持异步网络I/O事件模型epoll(linux2.6+)(通过epoll实现的web服务)
3、nginx的三大企业应用
nginx可能充当什么??
(1)web服务器
支持高性能,高并发的web服务器,与Apache相比,支持更多的并发连接访问,占用资源更少,效率更高
(2)反向代理或负载均衡
它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件,但是Nginx代理功能相对简单,特别是不支持TCP代理(Nginx1.9.0版本开始支持TCP代理了)
(3)前端业务数据缓存
在web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类似Squid等专业缓存软件的功能。
(数据缓存主要缓存的是图片和视频)主要做web缓存,并不是数据库缓存,降低的是存储压力。
·综上:Nginx三大功能(web服务,反向代理或负载均衡服务,前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前两个。
4、*Nginx和apache的原理与特点
Nginx的代码并不多,晚于Apache诞生的,Nginx的代码访问模型epoll模型==>异步i/o非阻塞模型。
Nginx对服务器资源占用非常少,哪试因为nginx是利用线程来接待用户的,而是一个进程里有很多的线程最多可以65536根。线程本身对内存的占用就很少。
进程就是一个资源池,线程在它里面调用资源,实际上这个资源池,在内存里开辟一个地方,而线程是进程产生的,没有进程就没有线程,进程开辟出的内存空间,线程之间是共享的。同一个进程里线程与线程之间的资源是共享的,这就是为什么ssh要用进程,因为每个用户要独立,要单独保存。
那为什么nginx要用线程接待用户呢?? 因为对浏览器访问的用户,是可以用线程接待的,但是在极高并发状态下,线程间并不稳定,容易产生资源上的冲突。
因为线程不是独立的,一个线程的崩溃会引发一个进程崩溃,但是一个进程崩溃对系统没有很大影响。
用进程接待用户,非常的稳定,但是对系统资源占用特别大,但是进程之间相互隔离,很少出现崩溃的现象。apache是多进程接待用户,nginx是多线程接待用户;
apache是select模型===>同步阻塞I/O apache也有多线程模式,但是一旦启动它的优势就没了,而且就算启动也没有nginx线程多,多进程模式,一个进程里只有一个线程,用户独占一个线程和进程;(这种模式很安全,一个进程的数据会保存在内存里)
nginx是epoll模型,但是多线程是不安全的,因为一个进程里有很多线程,一个线程输入机密数据,但是如果被黑客劫持了,会使机密泄露。
淘宝对nginx进行了二次开发====>Tengine
5、web服务产品性能对比测试
静态数据:不人工参与就无法改变的数据;比如图片、视频、以及xxx.html(nginx、apache)
动态数据:需要从MySQL里取数据。(TOMCAT PHP)
(1)静态文件处理能力对比图
(2)动态文件处理能力对比图
但是apache和nginx在工作中都不处理动态数据。
工作中nginx和php放在一起,apache也和php放在一起,在处理动态文件时,他们都交给php处理。
apache要把数据传递给php这个传递的速度,apache要比nginx快
php跟shell一样也是一种脚本语言。
6、为什么说Nginx总体性能比Apache高?
nginx中小企业用的非常多,主要介于它这3大功能,并且搭建起来特别简单。
软件轻便,能承受大并发,对服务器资源消耗少。(Apache则反之)
那为什么nginx性能高呢?主要是处理模型不同,具体看下图↓
性能相关要点
主要Nginx是异步单线程非阻塞IO模型(epoll),占用资源少,并且没有IO阻塞; 而apache是多线程同步阻塞IOselect模型,占用资源多,并且还存在阻塞。
二、nginx源码编译与搭建
先安装支持包
yum install -y pcre-devel openssl-devel #用本地yum仓库安装依赖包
#wget -q http://nginx.org/download/nginx-1.10.2.tar.gz #下载软件源码包
tar xf nginx-1.10.2.tar.gz -C /usr/src/ #解压缩
cd /usr/src/nginx-1.10.2
useradd -s /sbin/nologin -M www #创建程序用户
yum -y install gcc gcc-c++ make automake
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module #预配置
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ #给命令做软连接,以便PATH能找到
make && make install #编译和安装
echo $?
安装完毕
cd /usr/local/nginx
ls
conf(配置文件) html(网页目录 ) logs(日志文件) sbin(命令)
cd conf
ls
nginx.conf nginx.conf.default
mime.types (支持的数据类型)mime.types.default
fastcgi.conf fastcgi.conf.default
fastcgi_parsams fastcgi_parsams.default
配置nginx
egrep -v “#|^$” nginx.conf.default > nginx.conf
vim nginx.conf 这个配置文件要把它当成脚本(每行都要会,可以凭空写)
/usr/local/nginx/sbin/nginx -s reload nginx平滑重启命令
/usr/local/nginx/sbin/nginx -s stop nginx停止服务命令
/usr/local/nginx/sbin/nginx -s reload
nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
解决方法:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
---------------------
1.1 web排错三部曲下面介绍客户端排查的思路
第一步,在客户端上ping服务器端IP,命令如下:
ping 10.0.0.8排除物理线路问题影响
第二步,在客户端上telnet服务器端IP,端口,命令如下:
telnet 10.0.0.8 80排除防火墙等得影响
第三步,在客户端使用wget命令检测,如下:
wget 10.0.0.8(curl -I 10.0.0.8)模拟用户访问,排除http服务自身问题,根据输出在排错
以上三步是客户端访问网站异常排查的重要三部曲。
Nginx主配置文件nginx.conf
[root@chensiqi conf]# egrep -v "#|^$" nginx.conf #去掉包含#号和空行的内容
worker_processes 1; #worker进程的数量
error_log logs/error.log; #错误日志(默认没开)
pid logs/nginx.pid; #进程号(默认没开)
events { #事件区块开始
worker_connections 1024; #每个worker进程支持的最大连接数
} #事件区块结束
http { #http区块开始
include mime.types; #Nginx支持的媒体类型库文件包含
default_type application/octet-stream; #默认的媒体类型
sendfile on; #开启高效传输模式
keepalive_timeout 65; #连接超时。
server { #网站配置区域(第一个server第一个虚拟主机站点)
listen 80; #提供服务的端口,默认80
server_name www.chensiqi.org; #提供服务的域名主机名
location / { #第一个Location区块开始
root html; #站点的根目录(相对于nginx安装路径)
index index.html index.htm; #默认的首页文件,多个用空格分开
}
error_page 500 502 503 504 /50x.html; #出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { #Location区块开始,访问50x.html
root html; #指定对应的站点目录为html
}
}
server { #网站配置区域(第二个server第二个虚拟主机站点)
listen 80; #提供服务的端口,默认80
server_name bbs.chensiqi.org; #提供服务的域名主机名
location / { #服务区块
root html; #相对路径(nginx安装路径)
index index.html index.htm;
}
location = /50x.html { #发生错误访问的页面
root html;
}
}
}
三、nginx工作中的使用
worker_processes 1; 工作中,服务器是几核的就写几
worker connections 20480 工作中,线程数直接1024的20倍
还要优化linux的系统参数,配合优化
server_name www.yunjisuan.com ←域名(可改)
service iptables stop 需要关闭防火墙
写网页需要先写到主页里==>index.html(首页名字)
需要把域名和IP地址写到映射文件里==>/etc/hosts(为了让别人通过域名找到IP)
curl www.yunjisuan.com (映射文件转成IP)(模拟浏览器访问)
在windows里用浏览器访问,需要把windows的映射文件(/windows/system32/dricvers/etc)中添加
如果修改了配置文件需要重启,/usr/local/nginx/sbin/nginx -s reload平滑重启restart用户会掉线
配置文件的根设在哪,yunjisuan.com的起始位置就在哪里,根之下要从根开始输入相对路径到文件,根之上看不了!!
配置文件里,一个server函数代表一个网页
curl -v www.yunjisuan.com 看内容和报头
ulimit -n 每个进程的文件打开数1024 因为系统默认最高打开1024
没有系统的限制就65535
ps -ef | grep nginx
master process 用来监听端口的(进程)(超户的权限)
worker process 线程,用来接待用户的(程序用户的权限)
一个WEB服务器搭载多个网站的三种方法
1、基于不同域名的虚拟网站
2、基于不同监听端口的虚拟网站
3、基于不同IP的虚拟网站
(工作中一般用的都是域名)
(通过域名访问,会传达到配置文件里响应的域名函数里,如果通过IP访问, 默认会访问第一个函数。)
功能模块的说明
基于不同端口的虚拟网站
http协议默认访问80端口
如果向访问其他端口在后面加:81
eg:192.168.154.131:81
四、禁止非法访问的修改方法
因为一般人用域名访问,DNS公司通过解析域名到IP,会追查用户的地理位置;合法才能访问成功,所以黑客是不会通过域名访问网页的,这样会暴露自己的位置;
所以黑客一般都是通过IP访问的方式,访问网页。
这样就需要我们做一个防护措施,让所有使用IP访问的用户,不访问默认的第一个域名,而是转换成其他的网页。
(通过域名访问,会传达到配置文件里响应的域名函数里,如果通过IP访问, 默认会访问第一个函数。)
1、规范化Nginx配置文件
因为include是在配置目录里的,我们主配置文件里的函数引出,到配置目录里,每个函数形成一个单独的文件,而主配置文件中我们使用“include 目录/文件”的形式引出来
[root@localhost nginx]# cat conf/extra/www.conf
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root /var/www/html/wwwcom;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
}
修改完配置文件需要重启
/usr/local/nginx/sbin/nginx -s reload
工作中每一个网站会独立出一个配置来,这样就不用经常修改主配置文件了。
修改完配置文件 -t 用于检测
五、nginx状态信息检测模块
netstat -an | grep ESTAB
看用户访问情况
可求并发连接数 netstat -an |grep ESTAB| wc -l
ESTAB 是处于连接状态
可以显示目前有多少人访问、连接等详细信息(工作中可能会用到)
--with-http stub_status_module (这个模块就是检测模块)
这个状态信息也可以写到配置目录的一个文件里,然后在主配置文件里引用一下
注意:需要重启Nginx服务
出于安全起见,这个状态信息要防止外部用户查看。
1、添加错误日志
2、nginx访问日志轮询切割
默认情况下nginx会把访问日志生成到一个指定的访问文件access.log里,但时间一长就会导致日志个头很大,不利于日志的分析与处理,因此有必要对nginx日志按天或按小时进行切割,分成不同的文件保存。(本质就是某个时间移动改名)
[root@localhost nginx]# cat /server/scripts/cut_nginx_log.sh
#!/bin/bash
#日志切割脚本可挂定时任务,每天00点整执行
Dateformat=`date +%Y%m%d`
Basedir="/usr/local/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access"
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload
[root@localhost nginx]# cat >>/var/spool/cron/root << KOF
#cut nginx access log by Mr.chen
00 00 * * * /bin/bash /server/scripts/cut_nginx_log.sh >/dev/null 2>&1
六、location过滤函数
location是nginx非常重要的过滤函数,可以通过正则表达式来匹配不同URL里的URI部分,匹配到不同的URI进入到不同的Location,也就可以进入到不同的网页;因此,location如何过滤,过滤的优先级是什么是我们学习的重点。
顺序 |
匹配标识的location |
匹配说明 |
1 |
" location = / { " |
精确匹配 |
2 |
" location ^~ /images/ { " |
^~代表特殊正则,让字符串匹配临时高过普通正则 |
3 |
" loction ~* .(gif | jpg | jpeg)$ { " |
正则匹配,*为不区分大小写 |
4 |
" location /documents/ { " |
前缀型字符串匹配 |
5 |
" location / { " |
所有location都不能匹配后的默认匹配原则 |
/ 默认匹配
/documents/ 前缀字符串匹配
字符串匹配,字符越多,优先级最高,字符串匹配大于默认匹配
七、Nginx rewrite
1、什么是Nginx rewrite?
和Apache等Web服务软件一样,Nginx rewrite的主要功能也是实现URL地址重写。Nginx的rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配。默认参数编译时,Nginx就会安装支持rewrite的模块,但是,也必须要有PCRE软件的支持。
2、Nginx rewrite 语法
指令语法:rewrite regex replacement 【flag】;
默认值:none
应用位置:server,location,if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转例子:
rewrite ^/(.*) http://www.baidu.com/$1 permanent; (.*)里是uri
在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.baidu.com/$1 。这里的$1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.baidu.com/$1 地址上。
3、flag标记的说明
· 在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
· last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{...}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。
4、Nginx rewrite 的企业应用场景
Nginx的rewrite功能在企业里应用非常广泛:
· 可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
· 为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务
· 网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
· 根据特殊变量,目录,客户端的信息进行URL跳转等。
5、Nginx rewrite 301 跳转
以往我们是通过别名方式实现yunjisuan.com和www.yunjisuan.com访问同一个地址的,事实上,除了这个方式外,还可以使用nginx rewrite 301 跳转的方式来实现。实现的配置如下:
如果用户访问的url含有yunjisuan.com
那么我就把yunjisuan前面的东西取出来(比如A),然后对用户的url进行重写,重写成www.yunjisuan.com+A/yunjisuan.html
6、实现不同域名的URL跳转
示例:实现访问http://mail.yunjisuan.com时跳转到http://www.yunjisuan.com/mail/yunjisuan.html
·外部跳转时,使用这种方法可以让浏览器地址变为跳转后的地址,另外,要事先设置http://www.yunjisuan.com/mail/yunjisuan.html有结果输出,不然会出现401等权限错误。
配置Nginx rewrite规则
客户端访问测试
rewrite跳转标记flag使用总结
1,在根location(即location / {...})中或server{...} 标签中编写rewrite规则,建议使用last标记
2,在普通的location(例 location/yunjisuan/{...}或if{}中编写rewrite规则,则建议使用break标记)
八、Nginx访问认证
有时,在实际工作中企业要求我们为网站设置访问账号和密码权限,这样操作后,只有拥有账号密码的用户才可以访问网站内容。
这种使用账号密码才可以访问网站的功能主要应用在企业内部人员访问的地址上,例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIKI网站平台。
1、创建密码文件
我们可以借用apache的htpasswd软件,来创建加密的账号和密码
yum -y install httpd
[root@localhost ~]# which htpasswd
[root@localhost ~]# htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan 123123
生成了一个用户的文件,与账号密码
Adding password for user yunjisuan
[root@localhost ~]# cat /usr/local/nginx/conf/htpasswd
yunjisuan:FC1/eEc/iK0Mo #账号密码是加密的(htpasswd是文件的名字)
2、在虚拟主机配置文件里加入两条配置信息
[root@localhost html]# cat /usr/local/nginx/conf/extra/blog.conf
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root /var/www/html/blogcom;
index index.html index.htm;
auth_basic "yunjisuan training"; #加入这条配置
auth_basic_user_file /usr/local/nginx/conf/htpasswd; #加入这条配置
}
}
#配置解释:
auth_basic :验证的基本信息选项(后边跟着的双引号里就是验证窗口的名字)
auth_basic_user_file :验证的用户文件(后边根账号密码文件的绝对路径)
网页登陆验证
3、Tengine和Nginx是什么关系?
Tengine是淘宝开源Nginx的分支,官方站点为http://tengine.taobao.org/
九、如果用户访问找不到主页
nginx的403访问报错有可能是什么原因?
答:(1)Nginx配置文件里没有配置默认首页参数,或者首页文件在站点目录下没有如下内容:
index index.php index.html index.htm;
(2)站点目录或内部的程序文件没有Nginx用户访问权限
(3)Nginx配置文件中设置了allow,deny等权限控制,导致客户端没有访问权限。
(4)return 403
如果,nginx的主页文件被删除,或者名称对不上,致使nginx找不到主页;
默认是把网页根下所有的东西都给用户,但是nginx的安全机制把这一操作拒绝,最后致使用户看到的是403界面,访问权限被拒绝。
如果把这一拒绝机制打开,用户是可以看到根一下所有的文件的
还有一种就是,如果修改权限chmod 700 属主root 程序用户无权,也是403
还有一种是,主页文件所属的目录没有x权限,也就进不去这个目录,也是403
拒绝机制参数(默认是开):autoindex on; (这样就开了)
nginx的404访问报错有可能是什么原因?
服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源导致。
十、本章知识点回顾
1. Nginx的特性优点
2. 主流Web动态静态性能对比
3. Apache select 和Nginx epoll 模型的区别(面试常考)
4. 虚拟主机概念及类型分类详解
5. 基于域名和端口虚拟主机的介绍及搭建
6. Nginx错误,访问日志,以及访问日志切割
7. Nginx访问状态信息介绍及配置实践。
8. Nginx location介绍及配置实践
9. Nginx rewrite介绍及配置实践
10. Nginx Web访问认证介绍及配置实践