Nginx 详细讲解 一
第四部笔记
---私人文章
一 Nginx的特点
- 在性能上占用的系统资源少;支持更多的并发连接(特别是静态小文件场景下)达到更高的访问效率;
- 在功能上Nginx不但是一个优秀的Web服务软件,还可以作为反向代理负载均衡及缓存服务使用;
- 在安装配置上Nginx更为方便,简单,灵活;
二 Nginx是什么?
- Nginx是一个开源的,支持高性能高并发的www服务和代理服务软件
- Nginx因具有高并发(特别是静态资源)占用系统资源少等特性且功能丰富逐渐流行起来
- Nginx不但是一个优秀Web服务软件,还具有反响代理负载均衡功能和缓存服务功能,与LVS负载均衡及Haoroxy等专业代理软件相比Nginx部署起来更为简单,方便;在缓存功能方便它又类似Squid等专业的缓存服务软件
三 Nginx的重要面试知识
3.1Nginx的重要特性
- 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
- 资源消耗少:在3万并发链接下,开启10个Nginx线程小号的内存不到200MB
- 可以做HTTP反向代理及加速缓存,即都在均衡功能,内置对RS节点服务器健康的检查功能,相当于专业的Haproxy软件或LVS的功能
- 具备Squid等专业缓存软件等的缓存功能
- 支持异步网络I/O事件模型epoll(linux2.6+) #跟据epoll实现的Web服务
3.2 Nginx软件的主要企业功能应用
(1)作为Web服务软件
Nginx是一个支持高性能高并发的Web服务软件,它具有很多优秀的特性,作为Web服务器与Apache相比Nginx能够支持哼多的并发连接访问,但因占用的资源更少效率更高,在功能上也强大了很多,几乎不逊色与Apache(动态文件支持更好一些)
(2)反向代理或负载均衡服务
在反向代理或负载均衡服务方面,Nginx可以作为Web服务,PHP等动态服务及Memcached混村的代理服务器,它具有类似专业反响代理软件的功能(如Haproxy),同时也是一个宿友的邮件代理服务软件,但Nginx的代理功能还是相对简单了一些,特别不知此话TOP的代理(Nginx1.9.0版本已经开始支持TCP代理了)
(3)前端业务数据缓存服务---->Web缓存
在Web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业花奴才你软件的功能
综上:Nginx的这三大功能(Web服务,反向代理或负载均衡服务,前端业务数据缓存服务)是国内使用Nginx的主要场景,特别前两个
###3.3为什么Nginx总体性能比Apache高
- Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid,Memcached软件采用的都是epoll模型
- 处理大量连接的读写是,Apache所采用的slect(同步I/O网络模型)I/O模型比较低效!
3.4 同步I/O,异步I/O 模型原理
###如何正确选择Web服务器
- 静态业务:高并发场景尽量采用Nginx或Lighttpd,二者首选Nginx
- 动态业务:理论上采用Nginx和Apache均可,为了避免相同业务的服务软件多样化增加额外维护成本,建议现有Nginx兼做前端代理在根据页面元素的类型或目录转发到后端相应的服务器进行处理
- 既有静态业务又有动态业务:采用Nginx
- 如果并发不是很大,又对Apache很熟悉,采用Apache也是可以的。
五 编译 Nginx的编译安装部署
第一步:挂在光盘
mount /dev/sr0 /media/cdrom/
第二步:安装支持包
yum -y install pcre-devel openssl-devel
第三步:解压Nginx包到/usr/src目录下
tar xf nginx-1.10.3.tar.gz -C /usr/src
第四步 创建程序用户
useradd -s /sbin/nologin -M yinuo
第五步 编译
先进入Nginx目录下
cd /usr/src/nginx-1.10.3
./configure --user=yinuo --group=yinuo --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
备注:
--user=yinuo --group=yinuo --->告诉它用户和用户组是谁
--prefix=/usr/local/nginx --->安装到哪去叫什么
--with-http_stub_status_module --with-http_ssl_module --->定制模块
第六步 编译安装
make && make install
进入/usr/local/nginx看内容
conf(配置) html(网页) logs(日志) sbin
进入conf目录
nginx.conf--->配置文件
nginx-conf--->配置文件备份
mime.types--->媒体类型
mime.typel.default--->媒体类型备份
第七步 修改配置文件
egrep -v "#|^$" nginx.conf.default > nginx.conf ---> 去掉#号去掉空号从备份配置文件里写回到配置文件
修改配置文件
vim nginx.conf
worker_processes 1; ----> Nginx工作的进程个数,CPU几核就配几
events { ----> 事件函数(进程里的线程个数)
worker_connections 1024; ----> 工作中一般写20倍,20480
}
http { ----> Web服务函数
include mime.types; ----> include--->导入某个文件
default_type application/octet-stream;
sendfile on; ----> 文件的高效传输功能,默认为开
keepalive_timeout 65; ----> 连接保持功能,持续65秒server { ---->一个Server代表一个虚拟网站
listen 80; ----> socket进程的监听端口
server_name localhost; ----> 域名,网站首页名
location / {
root html; ----> 网页的根目录路径
index index.html index.htm; ----> 首页,索引
}
}
}
备注:我们自己修改换一个域名就好了 server_name 后改自己的域名
第八步 启动Nginx
绝对路径启动
/usr/local/nginx/sbin/nginx
没提示没关系,查看端口号看是否启动
ss -antup | grep 80
六 Nginx搭建网站
6.1 Linux 搭建单个网站
6.1.1 Linux 访问
1.第一步:进入/usr/local/nginx/html下删除里面所有文件
cd /usr/local/nginx/html
rm -rf *
2.写一个文件
echo "`hostname -I` www.yunjisuan.com" > index.html
3.给本地做映射
echo "`hostname -I` www.yunjisuan.com" >> /etc/hosts(映射文件位置)
4.模拟浏览器访 curl--->模拟浏览器访问命令
curl www.yunjisuan.com
出现: 192.168.200.156 www.yunjisuan.com
证明访问成功
6.1.2 Windows 访问
1.修改Windows映射文件
C盘-->windows-->system32-->drivers-->etc-->hosts
2.用原始浏览器登录
www.yunjisuan.com 即可
备注:
1. 配置文件中 如果 root html 后加 /XXX 那xxx为根,加几个 /xxx,最后一个 /xxx 为根,根之上的东西无论怎么操作都看不了
2. /usr/local/nginx/sbin/nginx -s reload 平滑重启Nginx
3.nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
报错?
解决办法:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
6.2 Linux 基于域名搭建多个网站
1.vim 配置文件增加server函数---> vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
2.进入 /usr/local/nginx/html 目录里创建它的网页目录。目录和域名名称尽量一样
[root@LianXiJi html]# mkdir bbs blog
[root@LianXiJi html]# echo "`hostname -I` bbs.yunjisuan.com" > bbs/index.html
[root@LianXiJi html]# echo "`hostname -I` blog.yunjisuan.com" > blog/index.html
3.修改映射文件
vim /etc/hosts
192.168.200.156 www.yunjisuan.com bbs.yunjisuan.com blog.yunjisuan.com ---> 添加其他网站域名即可
4.模拟浏览器访 curl--->模拟浏览器访问命令
curl www.yunjisuan.com
出现: 92.168.200.156 www.yunjisuan.com
curl bbs.yunjisuan.com
出现: 92.168.200.156 bbs.yunjisuan.com
curl blog.yunjisuan.com
出现: 92.168.200.156 blog.yunjisuan.com
证明访问成功
而输入IP却只得出 192.168.200.156 bbs.yunjisuan.com
[root@LianXiJi html]# curl 192.168.200.156
192.168.200.156 bbs.yunjisuan.com
问题1.为什么同一IP输出域名给的是不一样的?而输出IP给的确实第一个?
答:当它能够区分你是谁的时候你想看谁就看谁,当它区分不了你是谁的时候默认给第一个。
问题2.怎么区分?
1.1 通过域名访问 :curl -v www.yunjisuan.com (-v 看内容和报头)
答:Web服务器可以通过报头来查看你具体想看的域名的名字
1.2 通过IP访问 : curl -v 192.168.200.156
答:用户发给Web服务器的报文的报头里面只有IP地址,所以Web服务器不知道我想看的域名,因此它默认第一个
6.3 Linux 基于端口搭建多个网站
1.配置文件修改端口号-->vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 81;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
server {
listen 82;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
2.重启服务 /usr/local/nginx/sbin/nginx -s reload
3.浏览器输入 IP:端口号
总结:
1.一个Web服务器搭建多个网站有三种方法
1.1基于不同域名的虚拟网站
1.2基于不同监听端口的虚拟网站
1.3基于不同IP的虚拟网站 ---> 本地需要多个网卡
2.一般工作中都是用域名搭建不同网站
3.修改配置文件必须重启服务
问题1.怎样让非法访问我的用户一律都不能看到我的网站的信息?非法指的就是直接拿IP地址过来访问我的
答:1.vim 修改配置文件
listen 80 后加 default_server --> 让用IP地址访问的用户强制进入本Server
通常加一个server,我们这里直接修改了一个server
2.location / {}函数里加入直接犯错错误码让其直接跳出错误页面
6.4 优化后的Nginx配置的实战方案 include --- 导入
1.在配置文件目录下在创建目录
cd /usr/local/nginx/conf
mkdir extra
2.把配置文件里的Server都写到 extra 目录下
vim extra/bbs.conf
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
vim extra/www.conf
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
3.修改配置文件
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/bbs.conf;
include extra/www.conf;
server {
listen 80 default_server;
server_name blog.yunjisuan.com;
location / {
return 403;
}
}
}
6.5 Nginx状态信息检测模块 ---->显示Nginx目前有多少人访问,处理了多少需求,进行了多次类似三次握手的这种数据
--with-http_stub_status_module ---> 状态信息检测模块,一般编译时都会安装
1.在extra里设定状态信息配置 vim status.conf
erver {
listen 80;
server_name status.yunjisuan.com;
location / {
stub_status on; ----> 打开这个功能
access_log off; ----> 不记录日志
allow 192.168.200.156; ---->只允许我自己访问(可以制定用户)
deny all; ----> 其他一律拒绝
}
}
2.重启服务 /usr/local/nginx/sbin/nginx -s reload
3.修改映射文件,把状态信息配置添加进去 vim /etc/hosts
192.168.200.156 www.yunjisuan.com bbs.yunjisuan.com blog.yunjisuan.com status.yunjisuan.com
3.Nginx status 显示结果详解
curl status.yunjisuan.com`
Active connections: 1` ---> 表示Nginx正在处理的活动连接数1个
server accepts handled requests
19 19 19
Reading: 0 Writing: 1 Waiting: 0
- 一个server表示Nginx启动到现在1共处理了19次握手
- 第二个accepts表示Nginx启动到现在共成功创建了19次握手
- 请求丢失数=(握手数-连接数),可以看出本次状态显示没有丢失请求
- 第三个handled requests表示总共处理了19次请求
- Reading为Nginx读取到客户端的Header信息数,这个数永远是0
- waiting为Nginx返回给客户端的Header信息数
- Waiting为Nginx已经处理完正在等候一下次请求指令的驻留连接。在开启k- eep-alive的情况下这个值等于active-(reading+writing)
特别提示:出于安全起见,这个状态信息要防止外部用户查看
测试:
修改Windows配置文件 C盘-->windows-->system32-->drivers-->etc-->hosts
在原配置文件后加如stauts.yunjisuan.com bbs.yunjisuan.com
浏览器登陆status.yunjisuan.com
6.5 增加错误日志
常见的日志级别【debug|info|notice|warn|error|crit|alert|emerg】
生产场景一般是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗
error_log的默认值为: default:error_log logs/error.log error
在配置文件里增加内容,写在全局里
写在函数体里面函数生效,写在函数体外面全局生效 vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
error_log logs/error.log; ----> 添加此行即可
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
6.5 Nginx访问日志轮询切割
默认情况下Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但是这样时间长了就会导致日志个头数很大,不利于日志的分析和处理,因此有必要对Nginx日志按天或按小时进行切割,使其分成不同的文件保存
6.5.1 写一个日志切割脚本--->本质来说就是某个时间给它移动改名
#!/bin/bash
#日志切割脚本可挂定时任务,每天00点整执行
Dateformat=`data +%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 reload1 ----> 把日志名在从新刷出来
6.5.2将脚本放在定时任务里 crontab -e
00 00 * * * /bin/bash /root/cut_nginx_log.sh >/dev/null 2>&1
6.6 Nginx location
location是什么
location是Nginx非常重要的过滤函数,可以通过正则表达式来匹配过滤不同URL里的URI部分,匹配到不同的URI进入到不同的location也就可以进到不同的网页目录。
例:修改/usr/local/nginx/conf/extra目录里的www.conf文件
server {
listen 80;
server_name www.yunjisuan.com;
location / {
return 401;
}
location = /images/ {
return 402;
}
location ~/images/ {
return 502;
}
location = / {
return 403;
}
location /documents/ {
return 404;
}
location ^~/images/ {
return 501;
}
location ~*\.(gif|jpg|jpeg)$ {
return 500;
}
}
/ ---> 默认匹配,只含有一个/就可以,别的都不进就进我这
= ---> 精确匹配 后面必须是一个根符号不可以是其他才符合条件
=/images/ ---> 精确匹配,后面必须是/images/,差一个字符都不可以,后面什么都不可以有
/documents/ ---> 字符串前缀型模糊匹配,域名后面只能跟/documents/
字符串前缀型模糊匹配:必须是从根开始,在URI的起始部分出现,后面可以任意
^~/images/ ---> 前缀型正则匹配,特殊正则,必须以正则开头才符合条件
~*.(gif|jpg|jpeg)$ --->正则匹配,不需要从头开始,只要含有就行,以.gif|.jpg|..jpegj结尾就行
总结:location五种过滤方式的优先级关系:
- 精确匹配 (=)
- 前缀型正则匹配 (特殊正则--->^~)
- 普通正则 (~或~*,~*为bu'q,~为区分大小写)
- 字符串前缀型匹配 (/images/)默认匹配 ( / )
6.7 Nginx rewrite
6.7.1 什么是Nginx rewrite?
和Apache等Web服务软件一样,Nginx rewrite的只要功能也是实现URL地址重写。
Nginx的rewrite规则需要PCRE软件的支持即通过Perl兼容正则表达式语法进行规则匹配。
没骗人参数编译时,Nginx就会安装支持rewrite的模块,但是,也必须要有PCRE软件的支持。
6.7.2 Nginx rewrite 语法
(1) rewrite指令语法
指令语法:rewrite regex replacement 【结尾标记:flag】;
默认值:none
应用位置:server,location,if
replacement是实现URL重写的关键指令,根据regex(正则表达式)部分的内容重定向到replacement部分,结尾是flag标记。
例:rewrite ^/(.*) http://www.baidu.com/$1 permanent;
---> ()小括号相当于sed里的分组,这里$1值相等
(2)regex常用的正则表达式说明
- \ ---> 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。
- ^ --->匹配输入字符串的起始位置,如果设置了RegExp 对象的 Multiline 属性,^也匹配 “\n” 或 “r” 之后的位置。
- $ ---> 匹配输入字符串的结束为止,
,如果设置了RegExp 对象的 Multiline 属性,^也匹配 “\n” 或 “r” 之前的位置。- ( * ) ---> 匹配前面的字符零次或多次, 例如:Ol* 可以匹配 “o”及 “oll”,*等价于{o,}
- (+) ---> 匹配前面的字符一次或多次,例如:ol+ 能匹配 ol 及 oll 但不能匹配 o 。+等价于{l.}
- ? ---> 匹配前面的字符零次或一次。
- . ---> 匹配除 “\n”之外的任何单个字符,要匹配包括 “\n”在内的任何字符,请使用想“[.\n]”这样的模式。
(3) rewrite 指令的最后一项参数fiag标记说明
注:redirect是不会显示跳转后的URL地址
- 在以上flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变但在服务器端访问的程序及路径发生了变化。
- redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后idURL地址。
last和break标记的实现功能类似,但而这之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要只用bredk标记,last标记在本条rewrite规则执行完毕后吗会对其多有的server{...}标签重新发起请求,而bradk标记则会在本条规则匹配完成后终止匹配不再匹配后面的规则。
6.7.3 Nginx rewrite 的企业应用场景
- 可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
- 为了让搜索引擎收录网站内容并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
- 网站换新域名后,让旧网址的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
- 根据特殊变量,目录,客户端的信息进行URL跳转等。
6.7.4 Nginx rewrite 301跳转
以往我们是通过别名方式实现yunjisuan.com和www.yunjisuan.com访问同一个地址的,事实上除了这个方式外还可以使用nginx rewrite 301 跳转的方式来实现,配置如下:
server{
listen 80;
server_name yunjisaun.com;
rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent;
# 当用户访问yunjisuan.com及下面的任意内容是,都会通过这条rewrite跳转到www.yunjisuan.com对应的地址
}
6.7.5 实现不同域名的URL跳转
示例:实现访问http://mail.yunjisuan.com跳转到http://www.yunjisuan.com/mail/yunjisuan.html
外部跳转时,使用这种方法可以让浏览器地址变为跳转后的地址,另外,要实现这只http://www.yunjisuan.com/nail/yunjisuan.html有结果输出不然会出现401等权限错误。
(1) 配置Nginx rewrite 规则
server {
listen 80;
server_namen mail.yunjisuan.com;
location / {
root /var/www/html/mailcom;
index index.html index.htm;
}
if ( $http_host ~* "^(.*)\.yunjisuan\.com$") {
set $domain $1;
rewrite ^(.*) http://www.yunjisuan.com/$domain/yunjisuan.html break;
}
}
注:
1. http_host ---> 存放域名的变量
2. if 和 location 是并列的,如果后面成立就执行小括号里的东西
3. $1,只能重复一次,再出现它的值就会发生变化,要想不让它变化就得把值付给一个别的变量。 (set为设置的意思 set 变量=值)
6.7.6 rewrite跳转标记flag使用总结
- 在根location(即location / {...})中server{...}标签中编写rewrite规则建议使用last标记
- 在普通的location(location/yunjisuan/{...}或if{})中编写rewrite规则则建议使用break标记
6.8 Nginx 访问认证
在实际工作中企业要求我们为网站设置访问账号和密码权限,这样操作后只有拥有账号密码的用户才可以访问网站内容。这样使用账号密码才可以访问网站的功能,汉族要用用在企业内部人员访问的地址上。
例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIK网站平台。
6.8.1 创建文件密码
我们可以借用apache和htpasswd软件来创建加密的账号和密码
先查看有没有这个命令 : which htpasswd
没有就yum安装一个: yum -y install httpd
htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan “123456”
提示:Adding password for user yunjisuan
看一下里面内容,加密的: cat /usr/local/nginx/conf/htoasswd
yunjisuan:I8e2m4n9mbxDQ
6.8.2 在虚拟主机配置文件里加入两条配置信息
vim /usr/local/nginx/conf/exyra/status.conf
server {
listen 80;
server_name status.yunjisuan.com;
location / {
stub_status on;
access_log off;
auth_basic "Welcome to 167"; ---> 增加的文件
auth_basic_user_file /usr/local/nginx/conf/htpasswd --->增加的文件
}
}
配置解释:
auth_basic :验证的基本信息选项(后面跟着的双引号里就是验证窗口的名字)
auth_basic_user_file : 验证的用户文件(后面跟账号密码文件的绝对路径)
6.9 Nginx 相关问题解答
6.9.1 Tengine 和 Nginx 是什么关系?
答:Tengine是淘宝开源Nginx的分支,官方站点为http://tengine.taobao.org/
6.9.2 访问Nginx时出现状态码 “403 forbidden” 的原因 ?
答:
(1)Nginx配置文件里没有配置默认首页参数,或者首页文件在站点目录下没有以下内容:index index.php index.html index.htm;
(2)站点目录或内部的程序文件没有Nginx用户访问权限
(3)Nginx配置文件中设置了allow,deny等权限控制导致客户端没有访问权限