百晓生详解nginx(上)功能概述,常用功能模块的简介,在centos7上的安装及常用优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百晓生详解nginx(上)功能概述,常用功能模块的简介,在centos7上的安装及常用优化相关的知识,希望对你有一定的参考价值。
nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应。
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 php,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
为什么nginx有如此多的优势呢?这里我们就要从nginx的内核说起,虽然nginx核心依然是采用IO多路复用的模型,和apache一样,但是nginx使用的是功能更为强大的epoll作为内核代理,如下图所示
Nginx功能概述
HTTP基础功能:
处理静态文件,索引文件以及自动索引;
反向代理加速(无缓存),简单的负载均衡和容错;
FastCGI,简单的负载均衡和容错;
模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
SSL 和 TLS SNI 支持;
IMAP/POP3 代理服务功能:
使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
认证方法:
POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
IMAP: IMAP LOGIN;
SMTP: AUTH LOGIN PLAIN CRAM-MD5;
SSL 支持;
在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;
支持的操作系统:
FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
MacOS X (10.4) PPC;
结构与扩展:
一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;
kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;
kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;
sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。
最小化的数据拷贝操作;
其他HTTP功能:
基于IP 和名称的虚拟主机服务;
Memcached 的 GET 接口;
支持 keep-alive 和管道连接;
灵活简单的配置;
重新配置和在线升级而无须中断客户的工作进程;
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
4xx-5xx 错误代码重定向;
基于 PCRE 的 rewrite 重写模块;
基于客户端 IP 地址和 HTTP 基本认证的访问控制;
PUT, DELETE, 和 MKCOL 方法;
支持 FLV (Flash 视频);
带宽限制;
Nginx常用功能模块简介
基本模块
HTTP Core模块 //http核心模块
HTTP Upstream 模块 //这个模块提供一个简单方法来实现在轮询和客户端IP之间的后端服务器负荷平衡。
HTTP Access 模块 //此模块提供了一个简易的基于主机的访问控制.
HTTP Auth Basic 模块 //该模块可以使你使用用户名和密码基于 HTTP 基本认证方法来保护你的站点或其部分内容。
HTTP AutoIndex 模块 //此模块用于自动生成目录列表.
Browser //该模块创建变量,变量的值取决于请求头“用户代理”。
Charset //该模块将文本编码添加到“内容类型指示”响应头中。
Empty GIF //本模块在内存中常驻了一个 1x1 的透明 GIF 图像,可以被非常快速的调用。
FastCGI //这个模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。
Geo //该模块创建变量,其值依赖于客户端的IP地址。
Gzip //这个模块支持在线实时压缩输出数据流
HTTP Headers 模块 //本模板可以设置HTTP报文的头标。
HTTP Index 模块
Http Referer 模块 //这个模块使得可以用请求头部中“referer”的错误值来阻止对站点的访问。
HTTP Limit Zone 模块 //本模块可以针对条件,进行会话的并发连接数控制。
HTTP Limit Requests模块 //这个模块允许您限制会话的请求数量,或者限制一个地址的特殊情况。
Log
Map //该模块允许您将一组值分类或映射到一组不同的值中,并将结果存储在变量中。
Memcached //你可以利用本模块来进行简单的缓存以提高系统效率。本模块计划在未来进行扩展。
HTTP Proxy 模块 //此模块专伺将请求导向其它服务.
Rewrite //该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。
SSI模块 //此模块处理服务器端包含文件(ssi)的处理. 列表中的命令当前并未完全支持.
User ID //模块给出了用于识别客户端的cookie。对于日志记录,可以使用变量
其他模块
HTTP Addition 模块 //该模块在当前位置响应之前和之后添加其他位置的响应。
Embedded Perl //该模块可以通过SSI直接在NGIX和Perl Perl中执行Perl。
FLV //本模块提供FLV文件加载基于时间位移. 本模块必需在编译nginx时加上--with-http_flv_module.
Gzip Precompression //在开始压缩创建硬盘上的文件之前,本模块将查找同目录下同名的.gz压缩文件,以避免同一文件再次压缩。编译时加上:./configure --with-http_gzip_static_module
Random Index //从目录中选择一个随机目录索引
GeoIP //本模块ngx_http_geoip_module的变量基于IP地址匹配MaxMind GeoIP 二进制文件. 这个模块开始出现在nginx0.8.6。模块必需有geo数据库和读取数据库类
Real IP* //这个模块允许将客户端的IP地址从请求头更改为值(e. g. X-Real-IP or X-Forwarded-For)。如果nginx工作在L7负载均衡器的某个代理之后,并且请求来自本地IP,但是代理添加具有客户端IP的请求头,那么它很有用。这个模块不是默认构建的,用配置选项启用它--with-http_realip_module
SSL //该模块能够HTTPS支持。
Stub Status //这个模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在编译的时候手动添加编译参数 --with-http_stub_status_module
Substitution //本模块可以在nginx的回应中查找和替换文本.在编译nginx时必需加上--with-http_sub_module option
WebDAV //这个模块可以为Http webDAV 增加 PUT, DELETE, MKCOL, COPY 和 MOVE 等方法。这个模块在默认编译的情况下不是被包含的,你需要在编译时指定如下参数:./configure --with-http_dav_module
Google Perftools //这个模块能够对接开启谷歌性能工具。该模块出现在NGIX版本0.629中。默认情况下,模块开启,用配置选项启用./configure --with-google_perftools_module
XSLT* //该模块是一个借助于一个或多个XSLT模板转换XML响应的过滤器。用配置选项启用./configure --with-http_xslt_module
Secure Link //这个模块是计算和检测URL请求中必须的安全标识,这个模块没有默认编译,在编译Nginx时,必须使用明确的配置参数--with-http_secure_link_module
Image Filter //这个模块用来分发JPEG,GIF和PNG图片。这个没有默认开启,在编译nginx中通过./configure参数配置--with-http_image_filter_module
mail模块
Mail Core模块 //Nginx 能够处理和代理以下邮件协议:IMAP POP3 SMPT
Mail Auth模块 //auth_http URL 使用这条指令你可以设置URL像HTTP服务器那样的验证。auth_http_header 使用这条指令你可以添加HTTP头和值到验证进程中。这个使得可以用共享密码来却不请求得到Nginx的响应。auth_http_timeout 使用这条指令你可以设置验证进程的超时时间
Mail Proxy模块 //Nginx可以代理IMAP,POP3和SMTP协议
Mail SSL模块 //这个模块使得POP3/IMAP/SMTP可以使用SSL/TLS.配置已经定义了HTTP SSL模块,但是不支持客户端证书检测。
手工编译安装nginx(1.12.0版本)
--------安装依赖包-------------------
yum -y install pcre-devel zlib-devel gcc gcc-c++
useradd -M -s /sbin/nologin nginx //创建进程用户用于管理nginx
tar zxvf nginx-1.12.0.tar.gz -C /opt/
-----------编译----------------------
cd nginx-1.12.0/
./configure
--prefix=/usr/local/nginx
--user=nginx
--group=nginx
--with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
脚本注释:--with-http_stub_status_module //支持状态统计
-----检查、启动、重启、停止--------
nginx -t //检查
nginx //启动
killall -1 nginx //重启
killall -3 nginx //停止
yum install elinks -y
elinks http://localhost
-------制作管理角本--------
vi /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20
#description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig --level 35 nginx on
systemctl start nginx
systemctl status nginx
脚本注释
#!/bin/bash
#chkconfig: - 99 20
#description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid" //申明变量 PID文件,及nginx命令路径
case "$1" in ////$1表示指代以下状况(start,stop,status....)
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig --level 35 nginx on
systemctl start nginx
systemctl status nginx
nginx常用优化(一)隐藏版本号:在生产环境中,需要隐藏nginx的版本号,以避免泄露nginx的版本。
(本地IP:192.168.252.165)
1.第一种方法直接修改配置文件
curl -I http://192.168.252.165/ 查看版本信息
HTTP/1.1 200 OK
Server: nginx/1.12.0 //版本号为1.12.0
Date: Fri, 05 Oct 2018 14:37:17 GMT
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; //添加
systemctl reload nginx.service
curl -I http://192.168.252.165
HTTP/1.1 200 OK
Server: nginx //版本号被隐藏
Date: Fri, 05 Oct 2018 14:38:48 GMT
2.第二种方法修改源代码文件
vim /opt/nginx-1.12.0/src/core/nginx.h //在编译安装前修改该文件
#define NGINX_VERSION "1.12.0" //修改
常用优化(二)修改用户和组:nginx运行时进程需要有用户和组的支持,用以实现对网站文件读取时进行访问控制。主进程由root创建,子进程由指定的用户与组创建。Nginx默认使用nobody用户账号与组账号,一般也要进行修改。
1:第一种方法编译安装时指定
./configure --prefix=/usr/local/nginx //指定用户名为nginx
--user=nginx --group=nginx //指定组名为nginx
2:第二种方法vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; //首行修改
常用优化(三)配置网页缓存时间:当nginx将网页数据返回给客户端后,可设置缓存的时间,以便日后进行想用给内容的请求时直接返回,避免重复请求,加快访问速度,一般只针对静态资源进行设置,对动态网页不用设置缓存时间。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~.(gif|jpg|jpeg|png|bmp|ico)$ {
root html;
expires 1d;
}
脚本注释:
location ~.(gif|jpg|jpeg|png|bmp|ico)$ {
root html;
expires 1d;
}//添加 表示缓存静态网页是时间为1天
这时缓存时间已经开启以下是验证过程
cd /usr/local/nginx/html
cp /opt/game.jpg ./ //把图片文件拷贝到该文件夹下
vim index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<img src="game.jpg"> //添加本行
systemctl restart nginx.service
去windows客户端用抓包工具验证
常用优化(四)日志分割:随着nginx运行时间的增加,产生的日志也会增加,为了方便掌握nginx的运行状态,需要时刻关注nginx日志文件。太大的日志文件对监控是一个大灾难,非常不便于分析排查,因此需要定期地进行日志文件的切割。
vim /opt/fenge.sh //编写脚本/opt/fenge.sh
#!/bin/bash
#Filename:fenge.sh
d=$(date -d "-1 day" "+%Y%m%d")
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path
mv /usr/local/nginx/logs/access.log $logs_path/test.com-access.log-$d
kill -USR1 $(cat $pid_path)
find $logs_path -mtime +30 | xargs rm -rf
chmod +x fenge.sh
脚本注释
#!/bin/bash
#Filename:fenge.sh
d=$(date -d "-1 day" "+%Y%m%d") #显示前一天的日期%Y%m%d=年月日
logs_path="/var/log/nginx" #指定保存日志路径
pid_path="/usr/local/nginx/logs/nginx.pid" #进程ID路径
[ -d $logs_path ] || mkdir -p $logs_path #创建日志文件目录
mv /usr/local/nginx/logs/access.log $logs_path/test.com-access.log-$d #移动并重命名日志文件
kill -USR1 $(cat $pid_path) #重建新日志文件
find $logs_path -mtime +30 | xargs rm -rf #删除30天之前的日志文件
./fenge.sh
cd /var/log/nginx/
ls
test.com-access.log-20181006 //按日期分割了日志文件
cat /usr/local/nginx/logs/access.log //原来的日志文件重新创建
crontab -e //将脚本引入周期性计划任务
0 1 * /opt/fenge.sh //每天凌晨1:00执行脚本
常用优化(五)设置连接超时:在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现对连接访问时间的控制。
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
#log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
# ‘"$http_user_agent" "$http_x_forwarded_for"‘;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
脚本注释
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
#log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
# ‘"$http_user_agent" "$http_x_forwarded_for"‘;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65 180; //修改 服务器超时时间为65s,客户端为180s
client_header_timeout 80; //添加 指定等待客户端发送请求头部的超时时间
client_body_timeout 80; //添加 请求体读超时时间
客户端访问网址抓取数据报文,响应头中显示了超时时间为180S.
常用优化(六)更改进程数:在高并发环境中,需要启动更多的nginx进程以保证快速响应,用以处理用户的请求,避免造成阻塞。
ps aux | grep nginx //查看nginx运行进程的个数
root 50306 0.0 0.0 20544 620 ? Ss 09:24 0:00 nginx: master process /usr/local/nginx/sbin/nginx //主进程开启了1个
nginx 50307 0.0 0.1 23072 1648 ? S 09:24 0:00 nginx: worker process //子进程开启了1个
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 2; //修改
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 2048; //修改
}
systemctl stop nginx.service
systemctl start nginx
ps aux | grep nginx
root 54705 0.0 0.0 20544 616 ? Ss 13:17 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 54706 0.0 0.1 23472 1664 ? S 13:17 0:00 nginx: worker process
nginx 54707 0.0 0.1 23472 1668 ? S 13:17 0:00 nginx: worker process //子进程变为2个
root 54717 0.0 0.0 112720 980 pts/1 S+ 13:17 0:00 grep --color=auto nginx
修改nginx的配置文件中的worker_prcesses参数,一般设置为CPU的个数或者核心数,在高并发的情况下可以设置为CPU的个数或者核心数的2倍
cat /proc/cpuinfo | grep -c "physical" //查看CPU的核数以确定参数
常用优化(七)配置网页压缩:nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。
vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/html text/javascript;
gzip_vary on;
脚本注释
gzip on; //开启压缩功能
gzip_min_length 1k; //允许压缩的页面最小字节数,低于1k不压缩
gzip_buffers 4 16k; //表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; //用于设置识别http协议版本,默认是1.1
gzip_comp_level 2; gzip_types text/plain text/html text/javascript; //用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可
gzip_vary on; //选项可以让前端的缓存服务器缓存经过gzip压缩的页面
常用优化(八)配置防盗链:在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免不必要的带宽浪费。Nginx的防盗链功能非常强大,在默认情况下,只需要进行很简单的配置,即可实现防盗链处理。
源主机www.bt.com
盗链主机www.test.com
nginx服务端:
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
...........
添加以下内容
location ~.(jpg|gif|swf)$ {
valid_referers none blocked .bt.com bt.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.bt.com/error.png;
}
}
脚本注释:
~*.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg或.gif或.swf结尾的文件。
valid_referers:设置信任的网站,可以正常使用图片。
none:浏览器中referer为空的情况,就是直接在浏览器访问图片。
blocked:浏览器中referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或https://开头。
后面的网址或者域名:referer中包含相关字符串的网址。
if语句:如果连接的来源域名不再valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,进行重写或返回403页面。
常用优化(九)基于授权的访问控制
yum install httpd-tools.x86_64 -y
htpasswd -c /usr/local/nginx/passwd.db test //使用htppasswd生成用户认证文件,用户名是test
chown nginx passwd.db //将passwd.db属主更改为nginx
chmod 400 passwd.db //更改文件权限设为只读
vim nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
root html;
index index.html index.htm;
}
脚本注释:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
auth_basic "secret"; //添加 添加认证配置
auth_basic_user_file /usr/local/nginx/passwd.db; //添加 指定添加用户认证文件位置
root html;
index index.html index.htm;
}
客户端访问nginx服务器:需身份验证才能登录
基于客户端的访问控制
location / {
deny 192.168.252.132; //拒绝该IP地址访问
allow all; //允许其余所有IP客户端正常访问
以上就是nginx的功能概述,常用功能模块的简介,nginx在centos7上的安装及常用优化。在下一部分将为大家带来nginx在实际生产环境中的应用。
以上是关于百晓生详解nginx(上)功能概述,常用功能模块的简介,在centos7上的安装及常用优化的主要内容,如果未能解决你的问题,请参考以下文章