码迷,mamicode.com
首页 > 其他好文 > 详细

百晓生详解nginx(上)功能概述,常用功能模块的简介,在centos7上的安装及常用优化

时间:2018-10-12 19:22:22      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:com   image   mct   原来   事件   end   efi   google   ica   

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上的安装及常用优化

标签:com   image   mct   原来   事件   end   efi   google   ica   

原文地址:http://blog.51cto.com/13842738/2299324

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!