Nginx基础详细讲解
1.Nginx的特点
作为HTTP服务软件的后起之秀,Nginx与它的老大哥Apache相比有很多改进之处,比如,在性能上,Nginx占用的系统资源更少,能支持更多的并发连接(特别是静态小文件场景下),达到更高的访问效率;在功能上,Nginx不但是一个优秀的Web服务软件,还可以作为反向代理负载均衡及缓存服务使用;在安装配置上,Nginx更为方便,简单,灵活,可以说,Nginx是一个极具发展潜力的Web服务软件。
2.Nginx是什么?
3.Nginx的重要特性
4.Nginx软件的主要企业功能应用
4.1作为Web服务软件
Nginx是一个支持高性能,高并发的Web服务软件,它具有很多优秀的特性,作为Web服务器,与Apache相比,Nginx能够支持更多的并发连接访问,但占用的资源更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache。
4.2反向代理或负载均衡服务
在反向代理或负载均衡服务方面,Nginx可以作为Web服务,PHP等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件,但是Nginx的代理功能还是相对简单了些,特别是不支持TCP的代理(Nginx1.9.0版本已经开始支持TCP代理了)
4.3前端业务数据缓存服务
5.Web 服务产品性能对比测试
从下图中可以看出处理静态小文件(小于1MB时),Nginx和Lighttpd比Apache更有优势,Nginx处理小文件的优势明显,Lighttpd综合最强。
下图是各类Web服务器在动态数据性能上的对比,从图中可以看出,在处理动态数据时,三者的差距不大,Apache更有优势一点。这是因为处理动态数据的能力取决于PHP(java)和后端数据库的服务能力,也就是说瓶颈不在Web服务器上。一般情况下普通PHP引擎支持的并发连接参考值为300~1000,Java引擎和数据库的并发连接参考值为300~1500.业务场景及网站架构不同,并发连接数也会有上下浮动。
- Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid,Memcached软件采用的都是epoll模型。
- 处理大量连接的读写时,Apache所采用的select网络I/O模型比较低效
指标 | select(同步网络I/O模型) | epoll(异步网络I/O模型) |
---|---|---|
性能 | 随着连接数的增加性能急剧下降。处理成千上万并发连接数时,性能很差 | 随着连接数的增加,性能基本上没有下降。处理成千上万并发连接时,性能很好 |
连接数 | 连接数有限制,处理的最大连接数不超过1024。如果要处理的连接数超过1024个,则需要修改FD SETSIZE宏,并重新编译 | 连接数无限制 |
内在处理机制 | 线性轮询 | 回调callback |
开发复杂性 | 低 | 中 |
6.Nginx的编译安装部署
6.1用本地yum仓库安装依赖包
[root@Nginx /]# yum install -y pcre-devel openssl-devel gcc gcc-c++ make curl
[root@Nginx /]# rpm -qa pcre-devel openssl-devel gcc gcc-c++ make curl
openssl-devel-1.0.1e-15.el6.x86_64
gcc-4.4.7-4.el6.x86_64
gcc-c++-4.4.7-4.el6.x86_64
pcre-devel-7.8-6.el6.x86_64
make-3.81-20.el6.x86_64
curl-7.19.7-37.el6_4.x86_64
6.2创建程序用户
[root@Nginx /]# useradd -s /sbin/nologin -M www
[root@Nginx /]# id www
uid=500(www) gid=500(www) groups=500(www)
6.3#解压缩
[root@Nginx yang]# ls
Nginx-1.10.2.tar.gz
[root@Nginx yang]# tar xf Nginx-1.10.2.tar.gz -C /usr/src/
6.4预配置
[root@Nginx yang]# cd /usr/src/Nginx-1.10.2/
[root@Nginx Nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/Nginx --with-http_stub_status_module --with-http_ssl_module
以下省略。。。
6.5编译和安装
[root@Nginx Nginx-1.10.2]# make && make install
以下省略。。。
6.6给命令做软连接,以便PATH能找到
[root@Nginx Nginx-1.10.2]# ln -s /usr/local/Nginx/sbin/* /usr/local/sbin/
6.7启动Nginx
[root@Nginx Nginx-1.10.2]# /usr/local/Nginx/sbin/Nginx
特别提示:
7.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服务自身问题,根据输出在排错
8.Nginx主配置文件Nginx.conf(修改配置文件)
[root@yangwenbo conf]# pwd
/usr/local/Nginx/conf
[root@yangwenbo conf]# egrep -v "#|^$" Nginx.conf.default > Nginx.conf
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1; #worker进程的数量(服务器有几核就写几,不能超过核说的二倍)
events { #事件区块开始
worker_connections 20480; #每个worker进程支持的最大连接数的线程
} #事件区块结束
http { #http区块开始
include mime.types; #Nginx支持的媒体类型库文件包含(是把mime.types文件里的内容导入到当前位置,与把mime.types里的文件内容直接写入当前效果是一样的)
default_type application/octet-stream; #默认的媒体类型
sendfile on; #开启文件的高效传输功能
keepalive_timeout 65; #默认链接保持65秒
server { #网站配置区域(一个server就代表一个虚拟网站)
listen 80; #提供服务的端口,默认80
server_name localhost; #提供服务的“域名”(网页名)
location / {
root html; #网页的根目录路径
index index.html index.htm;
#首页 #首页文件
}
}
}
[root@yangwenbo ~]# ulimit -n #查看系统最大同时可以打开几个文件
1024
[root@yangwenbo ~]# ulimit -n 20480
20480 #临时修改系统最大同时打开文件的上限
[root@yangwenbo ~]# ulimit -n #即时生效
20480
9.虚拟主机概念和类型介绍
9.1虚拟主机概念
所谓虚拟主机,在Web服务里就是一个独立的网站站点(www.baidu.org),这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外提供服务供用户访问。
这个独立的站点在配置里是由一定格式的标签段标记,对于Apache软件来说,一个虚拟主机的标签段通常被包含在内,而Nginx软件则使用一个server{}标签来标示一个虚拟主机,一个Web服务里可以有多个虚拟主机标签对,即同时可以支持多个虚拟主机站点。
9.2虚拟主机类型
基于域名的虚拟主机:
- 所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站都是使用基于域名的虚拟主机,例如:www.etiantian.org
基于端口的虚拟主机
基于IP的虚拟主机
- 同理,所谓基于IP的虚拟主机,意思就是通过不同的IP区分不同的虚拟主机,此类虚拟主机对应的企业应用非常少见,一般不同业务需要使用多IP的场景都会在负载均衡器上进行VIP绑定,而不是在Web上通过绑定IP区分不同的虚拟机。
- 三种虚拟主机类型均可独立使用,也可以互相混合一起使用,同学们应把基于域名的虚拟主机类型当作重点来学习掌握,其他的两个类型了解即可。
10.项目实战
10.1项目实战(1)
10.1.1已知Nginx配置文件
[root@yangwenbo conf]# pwd
/usr/local/Nginx/conf
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.yangwenbo.com; #修改域名
location / {
root html;
index index.html index.htm;
}
}
}
10.1.2平滑重启Nginx并检查关闭防火墙
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload #平滑重启Nginx
[root@yangwenbo conf]# service iptables stop #关闭防火墙
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
10.1.3修改首页文件内容
[root@yangwenbo html]# pwd
/usr/local/Nginx/html
[root@yangwenbo html]# ls
50x.html index.html
[root@yangwenbo html]# rm -rf *
[root@yangwenbo html]# echo "`hostname -I` www.yangwenbo.com" > index.html
[root@yangwenbo html]# cat index.html
192.168.0.105 www.yangwenbo.com
[root@yangwenbo html]# echo "`hostname -I` www.yangwenbo.com" >> /etc/hosts #追加到映射文件里
[root@yangwenbo html]# cat /etc/hosts | tail -1
192.168.0.105 www.yangwenbo.com
10.1.4Linux 实验
[root@yangwenbo conf]# curl www.yangwenbo.com
192.168.0.105 www.yangwenbo.com
10.1.5修改windos的映射文件
10.1.6在windos上查看实验结果
10.2项目实战(2)
10.2.1已知Nginx配置文件
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 81; #修改其端口为81
server_name www.yangwenbo.com;
location / {
root html;
index index.html index.htm;
}
}
}
10.2.2平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
10.2.3普通登录
[root@yangwenbo html]# curl www.yangwenbo.com
curl: (7) Couldn't connect to host #已无法正常登录
10.2.4指定端口登录
[root@yangwenbo html]# curl www.yangwenbo.com:81 #指定端口为81(Nginx默认端口为80)
192.168.0.105 www.yangwenbo.com
10.2.5windos普通登录
10.2.6windos指定端口登录
10.3项目实战(3)
10.3.1已知Nginx配置文件
[root@yangwenbo conf]# pwd
/usr/local/Nginx/conf
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.yangwenbo.com;
location / {
root html/yang; #修改根目录路径为yang
index index.html index.htm;
}
}
}
10.3.2平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
10.3.3在windos上实验结果
10.3.4修改首页文件内容
[root@yangwenbo html]# pwd
/usr/local/Nginx/html
[root@yangwenbo html]# ls
index.html
[root@yangwenbo html]# rm -rf *
[root@yangwenbo html]# mkdir yang
[root@yangwenbo html]# echo "`hostname -I` www.yangwenbo.com" > yang/index.html
[root@yangwenbo html]# cat yang/index.html
192.168.0.105 www.yangwenbo.com
10.3.5再次在windos上实验结果
10.4项目实战(4)
10.4.1已知Nginx配置文件
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name logs.yangwenbo.com;
location / {
root html/bo;
index index.html index.htm;
}
}
server {
listen 80;
server_name 123.yangwenbo.com;
location / {
root html/wen;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yangwenbo.com;
location / {
root html/yang;
index index.html index.htm;
}
}
}
10.4.2平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
10.4.3修改首页文件内容(现在共计3个域名)
[root@yangwenbo html]# pwd
/usr/local/Nginx/html
[root@yangwenbo html]# ls
yang
[root@yangwenbo html]# mkdir bo
[root@yangwenbo html]# echo "`hostname -I` logs.yangwenbo.com" > bo/index.html
[root@yangwenbo html]# cat bo/index.html
192.168.0.105 logs.yangwenbo.com
[root@yangwenbo html]# echo "`hostname -I` logs.yangwenbo.com" >> /etc/hosts #追加到映射文件里
[root@yangwenbo html]# cat /etc/hosts | tail -1
192.168.0.105 logs.yangwenbo.com
[root@yangwenbo html]# mkdir wen
[root@yangwenbo html]# echo "`hostname -I` 123.yangwenbo.com" > wen/index.html
[root@yangwenbo html]# cat wen/index.html
192.168.0.105 123.yangwenbo.com
[root@yangwenbo html]# echo "`hostname -I` 123.yangwenbo.com" >> /etc/hosts #追加到映射文件里
[root@yangwenbo html]# cat /etc/hosts | tail -1
192.168.0.105 123.yangwenbo.com
10.4.4Linux 实验结果(域名)
[root@yangwenbo html]# curl logs.yangwenbo.com
192.168.0.105 logs.yangwenbo.com
[root@yangwenbo html]# curl 123.yangwenbo.com
192.168.0.105 123.yangwenbo.com
[root@yangwenbo html]# curl www.yangwenbo.com
192.168.0.105 www.yangwenbo.com
10.4.5Linux 实验结果(IP)
[root@yangwenbo html]# curl 192.168.0.105 #只指定IP,默认访问第一个域名
192.168.0.105 logs.yangwenbo.com
10.5项目实战(5)
10.5.1已知Nginx配置文件
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.yangwenbo.com;
location / {
root html/bo;
index index.html index.htm;
}
}
server {
listen 80;
server_name 123.yangwenbo.com;
location / {
root html/wen;
index index.html index.htm;
}
}
server { #防黑域名
listen 80 default_server; #IP用户访问默认进入此页面
server_name logs.yangwenbo.com;
location / {
return 403; #错误代码
}
}
}
10.5.2平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
10.5.3Linux 实验结果
[root@yangwenbo html]# curl www.yangwenbo.com
192.168.0.105 www.yangwenbo.com
[root@yangwenbo html]# curl 123.yangwenbo.com
192.168.0.105 123.yangwenbo.com
[root@yangwenbo html]# curl 192.168.0.105 #只要是IP访问都是此页面
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>Nginx/1.10.2</center>
</body>
</html>
10.6项目实战(6)
10.6.1创建Nginx副配置文件
[root@yangwenbo conf]# pwd
/usr/local/Nginx/conf
[root@yangwenbo conf]# mkdir extar
[root@yangwenbo conf]# cat extar/www.conf
server {
listen 80;
server_name www.yangwenbo.com;
location / {
root html/bo;
index index.html index.htm;
}
}
[root@yangwenbo conf]# cat extar/123.conf
server {
listen 80;
server_name 123.yangwenbo.com;
location / {
root html/wen;
index index.html index.htm;
}
}
10.6.2已知Nginx主配置文件
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extar/www.conf; #文件导入
include extar/123.conf; #文件导入
server {
listen 80 default_server;
server_name logs.yangwenbo.com;
location / {
return 403;
}
}
}
10.6.3平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
10.6.4Linux 实验结果
[root@yangwenbo conf]# curl www.yangwenbo.com
192.168.0.105 www.yangwenbo.com
[root@yangwenbo conf]# curl 123.yangwenbo.com
192.168.0.105 123.yangwenbo.com
10.7项目实战(7)
10.7.1创建Nginx副配置文件
[root@yangwenbo conf]# cat extar/status.conf
server {
listen 80;
server_name status.yangwenbo.com;
location / {
stub_status on; #开启状态信息功能
access_log off; #不记录访问日志
allow 192.168.0.105; #只允许某IP地址访问
deny all; #禁止其他IP访问
}
}
10.7.2已知Nginx主配置文件
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extar/www.conf;
include extar/123.conf;
include extar/status.conf; #文件导入
server {
listen 80 default_server;
server_name logs.yangwenbo.com;
location / {
return 403;
}
}
}
10.7.3加入本机映射文件
[root@yangwenbo conf]# echo "`hostname -I` status.yangwenbo.com" >> /etc/hosts
[root@yangwenbo conf]# cat /etc/hosts | tail -1
192.168.0.105 status.yangwenbo.com
10.7.4平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
10.7.5Linux 实验结果
[root@yangwenbo conf]# curl status.yangwenbo.com
Active connections: 1 #处于活动中的连接为1个(最低一个)
server accepts handled requests
92 92 60
Reading: 0 Writing: 1 Waiting: 0
以上所示详解
11. Nginx location
11.1创建Nginx副配置文件
[root@yangwenbo extar]# pwd
/usr/local/Nginx/conf/extar
[root@yangwenbo extar]# cat y.conf
server {
listen 80;
server_name www.yunjisuan.com;
location / { #默认匹配
return 401;
}
location = /images/ { #精确匹配
return 402;
}
location /documents/ { #模糊匹配(字符串前缀匹配,必须从根开始)
return 404;
}
location ^~ /images/ { #特殊正则匹配
return 501;
}
location ~* \.(gif|jpg|jpeg)$ { #普通正则匹配
return 500;
}
}
11.2已知Nginx主配置文件
[root@yangwenbo conf]# pwd
/usr/local/Nginx/conf
[root@yangwenbo conf]# cat Nginx.conf
worker_processes 1;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
include extar/y.conf; #文件导入
server {
listen 80 default_server;
server_name logs.yangwenbo.com;
location / {
return 403;
}
}
}
11.3平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
11.4实验如下
11.4.1默认匹配(默认优先级最低)
11.4.2特殊正则与普通正则
由此证明:特殊正则优先级高于普通正则
11.4.3普通正则与模糊匹配(字符串前缀匹配)
由此证明:普通正则优先级高于模糊匹配(字符串前缀匹配)
11.4.4精确匹配与特殊正则
**由此证明:精确匹配优先级高于特殊正则
11.4.5由此可以得出
顺序 | 匹配标识的location | 匹配说明 |
---|---|---|
1 | " location = / { " | 精确匹配 |
2 | " location ^~ /images/ { " | 先进行字符串的前缀匹配,如果匹配到就不做正则匹配检查 |
3 | " loction ~* .(gif jpg jpeg )$ { " |
正则匹配,*为不区分大小写 |
4 | " location /documents/ { " | 匹配常规字符串,模糊匹配,如果有正则检查,正则优先 |
5 | " location / { " | 所有location都不能匹配后的默认匹配原则 |
12.Nginx rewrite 语法
12.1regex常用正则表达式说明
字符 | 描述 |
---|---|
/ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。例如,“\n”匹配一-个换行符,序列“ ”和“$”则匹配“$” |
^ | 匹配输人字符串的起始位置,如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“r之后的位置 |
$ |
匹配输入字符串的结束位置,如果设置了RegExp对象的Multiline属性,$ 也匹配“\n” 或“\r”$ 之前的位置 |
* | 匹配前面的字符零次或多次,例如,01能匹配“0”及“0111",等价于{0,} |
+ | 匹配前面的字符一次或多次,例如,“01+” 能匹配“01”及“011", 但不能匹配“0”, .+等价于{1,} |
? | (1)匹配前面的字符零次或一次,例如,“do(es)?”可以匹配“do”或“does”中的“do",.?等价于{0,1}。 |
? | (2)当该字符紧跟在任何一个其他限制符( *.+?. {n},{n}, {n,m})的后面时,匹配模式是非贪婪模式的,非贪婪模式会尽可能少地匹配所搜索的字符串,而默认的贪婪模式则会尽可能多地匹配所搜索的字符串,例如,对于字符串“0000” ,“o+?”将匹配单个“o”. 而“o+” 将匹配所有“o” |
. | 匹配除“\n”之外的任何单个字符,要匹配包括“\n”在内的任何字符,请使用像“[\m]”这样的模式 |
( pattern ) | 匹配括号内的pattern,并可以在后面获取对应的匹配,常用$0..$9 属性获取小括号中的匹配内容。要匹配圆括号字符,请使用“(”或“)” |
12.2rewrite指令的最后一项参数flag标记的说明
flag标记符号 | 说明 |
---|---|
last | 本条规则匹配完成后,继续向下匹配新的location URI规则 |
break | 本条规则匹配完成即终止,不再匹配后面的任何规则 |
redirect | 返回302临时重定向,浏览器地址栏不会显示跳转后的URL地址 |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 |
12.3Nginx rewrite 的企业应用场景
13.Nginx访问认证
13.1安装依赖软件包
[root@yangwenbo /]# yum -y install httpd
[root@yangwenbo /]# which htpasswd
/usr/bin/htpasswd
13.2使用apache的htpasswd软件,来创建加密的账号和密码
[root@yangwenbo /]# htpasswd -bc /usr/local/Nginx/conf/htpasswd yunjisuan 123123 #htpasswd是文件的名字
Adding password for user yunjisuan
[root@yangwenbo /]# cat /usr/local/Nginx/conf/htpasswd
yunjisuan:msULyJwjSSlEY #账号密码是加密的
13.3在虚拟主机配置文件里加入两条配置信息
[root@yangwenbo extar]# pwd
/usr/local/Nginx/conf/extar
[root@yangwenbo extar]# cat status.conf
server {
listen 80;
server_name status.yangwenbo.com;
location / {
stub_status on;
access_log off;
auth_basic "welcome to yangwenbo";
auth_basic #验证的基本信息选项(后边跟着的双引号里就是验证窗口的名字)
auth_basic_user_file /usr/local/Nginx/conf/htpasswd;
#auth_basic_user_file #验证的用户文件(后边根账号密码文件的绝对路径)
}
}
13.4平滑重启Nginx
[root@yangwenbo conf]# /usr/local/Nginx/sbin/Nginx -s reload
13.5实际演练
13.6演练结果
14.Nginx相关问题解答
14.1Tengine和Nginx是什么关系?
14.2访问Nginx时出现状态码“403 forbidden”的原因
Nginx配置文件里没有配置默认首页参数,或者首页文件在站点目录下没有如下内容:
index index.PHP index.html index.htm;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。