nginx原理及使用

时间:2023-03-09 00:20:30
nginx原理及使用

Nginx的特点:

方便 简单 灵活 比较具有发展潜力的服务软件 在性能上占用的系统资源更少 能支持更多的并发连接 , 特别是静态小文件场景下, 达到更的访问效率。
Nginx是什么?

Nginx是一个开源,支持高性能,高并发的www服务和代理服务软件。
Nginx因具有高并发,特别是静态资源,占用系统资源少等特性,且功能丰富而逐渐流行起来。
Nginx不单是一个优秀的Web服务软件。还具有反向代理负载均衡功能和缓存服务功能,在lvs负载均衡及Haproxy等专业代理软件相比。Nginx部署起来更为简单,方便。 在缓存功能方面,它类似于Squid等专业的缓存服务软件

Nginx的重要特性:

支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
具备Squid等专业缓存软件的缓存功能。
支持异步网络I/O事件模型epoll(linux2.6)。
Nginx软件的主要企业功能应用

(1)作为Web服务软件

Nginx是一个支持高性能,高并发的Web服务软件,它具有很多优秀的特性,作为Web服务器,与Apache相比,Nginx能够支持更多的并发连接访问,但占用的资源更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache。
(2)反向代理或负载均衡服务

在反向代理或负载均衡服务方面,Nginx可以作为Web服务,PHP等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件,但是Nginx的代理功能还是相对简单了些,特别是不支持TCP的代理(Nginx1.9.0版本已经开始支持TCP代理了)
(3)前端业务数据缓存服务

在Web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。
综上:Nginx的这三大功能(Web服务,反向代理或负载均衡服务,前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前两个。

1,nginx的编译安装部署

yum install -y pcre-devel openssl-devel         #用本地yum仓库安装依赖包
#wget -q http://nginx.org/download/nginx-1.10.2.tar.gz #下载软件源码包
useradd -s /sbin/nologin -M www #创建程序用户
tar xf nginx-1.10.2.tar.gz -C /usr/src/ #解压缩
cd /usr/src/nginx-1.10.2
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module #预配置
make && make install #编译和安装
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ #给命令做软连接,以便PATH能找到
cd /usr/local/nginx/conf
egrep -v "#|^$" nginx.conf.default > nginx.conf #把#号去了
vim nginx.conf
worker_processes 1; #nginx工作的进程个数
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.yunjisuan.com; #随便起个域名
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
#这个脚本要背下来!
/usr/local/nginx/sbin/nginx #启动nginx

nginx原理及使用
include什么意思?

调用文件到当前行 ,脚本也可以。它的相对路径是当前配置文件的路径
连接保持是什么意思?

假如我们打开一个网页,先得进行三次握手,没有连接保持就会不断进行三次握手,有了连接保持时间就不用一直三次握手了。
在服务器大并发的时候 开启它,降低三次握手带来的成本消耗
apche不能一直开着它 ,得需要考虑什么时候开,什么时候不开
特别提示:
/usr/local/nginx/sbin/nginx -s reload平滑重启命令
/usr/local/nginx/sbin/nginx -s stop停止服务命令

继续:
cd html
echo “hostname -Iwww.yunjisuan.com” > index.html
echo “hostname -Iwww.yunjisuan.com” >> /etc/hosts
curl www.yunjisuan.com #curl 模拟访问命令
nginx原理及使用

加网址的话在配置文件复制几个server就可以了。然后在/etc/hosts里添加之后 重启一下nginx就行了
一个Web服务器搭建多个网站有三个方法

1,基于不同域名的虚拟网站
2,基于不同的监听端口的虚拟网站
3,基于不同IP的虚拟网站(得两个网卡)
基于不同的监听端口方法

就是在配置文件里 把80改成别的 然后重启 然后比如访问81端口
192.168.200.138:81
禁止非法访问

不想让用户拿IP访问怎么做
nginx原理及使用
3,Nginx其他配置文件

如果是配合动态服务(例如PHP服务),Nginx软件还会用到扩展的fastcgi相关配置文件,这个配置是通过在Nginx.conf主配置文件中嵌入include命令来实现的,不过默认情况是注释状态,不会生效。
fastcgi.conf配置文件的初始内容如下:

[root@localhost conf]# cat fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

nginx原理及使用
4,Nginx的功能模块说明

nginx原理及使用

5,Nginx虚拟主机配置实战

5.1 虚拟主机概念和类型介绍

5.1.1 虚拟主机概念

所谓虚拟主机,在Web服务里就是一个独立的网站站点(www.baidu.org),这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外提供服务供用户访问。
这个独立的站点在配置里是由一定格式的标签段标记,对于Apache软件来说,一个虚拟主机的标签段通常被包含在内,而Nginx软件则使用一个server{}标签来标示一个虚拟主机,一个Web服务里可以有多个虚拟主机标签对,即同时可以支持多个虚拟主机站点。
5.1.2 虚拟主机类型
常见的虚拟主机类型有如下几种。

基于域名的虚拟主机

所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站都是使用基于域名的虚拟主机,例如:www.etiantian.org
基于端口的虚拟主机

同理,所谓基于端口的虚拟主机,意思就是通过不同的端口来区分不同的虚拟主机,此类虚拟主机对应的企业应用主要为公司内部的网站,例如:一些不希望直接对外提供用户访问的网站后台等,访问基于端口的虚拟主机地址里要带有端口,例如:http://www.baidu.com:80
基于IP的虚拟主机

同理,所谓基于IP的虚拟主机,意思就是通过不同的IP区分不同的虚拟主机,此类虚拟主机对应的企业应用非常少见,一般不同业务需要使用多IP的场景都会在负载均衡器上进行VIP绑定,而不是在Web上通过绑定IP区分不同的虚拟机。
三种虚拟主机类型均可独立使用,也可以互相混合一起使用,同学们应把基于域名的虚拟主机类型当作重点来学习掌握,其他的两个类型了解即可。
5.2 基于域名的虚拟主机配置实战

说明:本节内容再生产场景中是最常用到的,因此,要优先并且熟练掌握。
5.2.1 配置基于域名的nginx.conf内容

这里使用grep过滤命令来生成基础的Nginx主配置文件nginx.conf,然后根据生成的初始配置进行修改,使其成为所需的形式,具体步骤为:

[root@localhost conf]# pwd
/application/nginx/conf
[root@localhost conf]# egrep -v "#|^$" nginx.conf.default >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 localhost;
location / {
root html/www;
index index.html index.htm;
}
}
}

编辑完配置文件后,我们需要检查语法

[root@localhost conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2//conf/nginx.conf test is successful

然后由于web的存放路径是相对路径,因此我们需要创建个目录,
nginx原理及使用

接下来,我们再创建一个域名的网站,配置文件如下
nginx原理及使用
注意:修改配置文件需要重启动nginx
给第二个网站添加网页文件

[root@localhost html]# ls
50x.html index.html www
[root@localhost html]# mkdir bbs
[root@localhost html]# echo "I am bbs" > bbs/index.html

通过测试,我们发现,永远都只能看到第一个网站

[root@localhost html]# curl 192.168.0.100
I am www
[root@localhost html]# curl 192.168.0.100
I am www
[root@localhost html]# curl 192.168.0.100
I am www
[root@localhost html]# curl 192.168.0.100
I am www

这是因为通过IP地址来访问的话,nginx并不知道你想要访问哪个站点,因此,他默认你是要访问他配置文件里的第一个站点,也就是www.chensiqi.com
通过修改hosts映射我们可以访问不同的站点。
修改hosts映射文件
nginx原理及使用

6 Nginx常用功能配置实战
6.1 规范化Nginx配置文件
下面是优化后的Nginx配置的实战方案

worker_processes  1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/www.conf; #虚拟网站配置信息统一放在了当前的extra目录下
include extra/mail.conf;
include extra/status.conf;
}
[root@localhost nginx]# tree conf/extra/
conf/extra/
├── mail.conf
├── status.conf
└── www.conf
0 directories, 3 files
[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;
}
}

6.2.1 Nginx状态信息功能实战

6.2.1 确认编译时是否设定了此模块

root@localhost nginx]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx-1.10.2/ --with-http_stub_status_module --with-http_ssl_module
##说明
--with-http_stub_status_module模块就是状态信息模块

6.2.2 设定信息模块配置

[root@localhost nginx]# cat conf/extra/status.conf
##status
server{
listen 80;
server_name status.yunjisuan.com;
location / {
stub_status on; #开启状态信息功能
access_log off; #不记录访问日志
}
}
##说明
状态信息模块配置方式和搭建虚拟网站类似需要占用一个域名来访问

注意:需要重启Nginx服务

Nginx status显示结果详解

[root@localhost nginx]# curl status.yunjisuan.com
Active connections: 2 #表示Nginx正在处理的活动连接2个
server accepts handled requests
39 39 41
Reading: 0 Writing: 1 Waiting: 1

第一个server表示Nginx启动到现在2共处理了39个连接
第二个accepts表示Nginx启动到现在共成功创建了39次握手
请求丢失数=(握手数-连接数),可以看出,本次状态显示没有丢失请求。
第三个handled requests,表示总共处理了41次请求。
Reading为Nginx读取到客户端的Header信息数
Writing为Nginx返回给客户端的Header信息数
Waiting为Nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keep-alive的情况下,这个值等于active - (reading+writing)

特别提示:

出于安全起见,这个状态信息要防止外部用户查看。
6.3 增加错误日志
范例:error_log file level;

常见的日志级别【debug|info|notice|warn|error|crit|alert|emerg】
生产场景一般是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗。
error_log的默认值为:

# default:error_log logs/error.log error;
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;
include extra/www.conf;
include extra/mail.conf;
include extra/status.conf;
}

6.4 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

Nginx location

location使用的语法为:

location [ = | ~ | ~* | ^~ ] uri {
...
}

从多个location的配置匹配可以看出匹配的优先顺序
nginx原理及使用

Nginx rewrite

什么是Nginx rewrite?

和Apache等Web服务软件一样,Nginx rewrite的主要功能也是实现URL地址重写。Nginx的rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配。默认参数编译时,Nginx就会安装支持rewrite的模块,但是,也必须要有PCRE软件的支持。

6.6.2 Nginx rewrite 语法
(1)rewrite指令语法

指令语法:rewrite regex replacement 【flag】;
默认值:none
应用位置:server,location,if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转例子:
rewrite ^/(.http://www.baidu.com/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^(.
),这是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.baidu.com/1
这里的1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.baidu.com/$1 地址上。

(2)regex常用正则表达式说明
nginx原理及使用
redirect:不会显示,上面图片写错了!!!!

在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

Nginx rewrite 的企业应用场景
Nginx的rewrite功能在企业里应用非常广泛:

可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务
网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
根据特殊变量,目录,客户端的信息进行URL跳转等。

Nginx rewrite 301 跳转

以往我们是通过别名方式实现yunjisuan.com和www.yunjisuan.com访问同一个地址的,事实上,除了这个方式外,还可以使用nginx rewrite 301 跳转的方式来实现。实现的配置如下

[root@localhost nginx]# cat conf/extra/www.conf
#www virtualhost by Mr.chen
server {
listen 80;
server_name www.yunjisuan.com;
root /var/www/html/wwwcom;
location / {
index index.html index.htm;
}
# location = / {
# return 402;
# }
location = /images/ {
return 501;
}
location /documents/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
}
server{
listen 80;
server_name yunjisuan.com;
rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent;
#当用户访问yunjisuan.com及下面的任意内容时,都会通过这条rewrite跳转到www.yunjisuan.com对应的地址
}