Nginx深度学习

secure_link_module模块

  • 定制并且允许检查请求的连接的真实性以及保护资源免遭未经授权的访问

  • 限制链接生效周期

相关配置语法

syntax:secure_link expression;
Default:————
Context:http,server,location

syntax:secure_link_md5 expression;
Default:————
Context:http,server,location

验证的方式

/download?md5=???&expire=???
md5加密,expire过期校验

nginx性能调优

nginx web静态 反向代理(负载均衡)lvs、haproxy重量级 静态缓存服务器(varnish、squid)一般不使用Nginx做静态缓存

nginx tomcat:

  • 功能方向

  • 性能方向

源码编译Nginx及其性能测试工具

yum -y install pcre pcre-devel  # 安装pcre库是为了支持Nginx HTTP Rewrite模块

yum -y install openssl openssl-devel gcc-c++ gcc -y
<1> 源码编译检测工具
tar -xf gperftools-2.4.tar.gz
cd gperftools-2.4
./configure --prefix=/usr/local/ --enable-frame-pointers
make && make install 


<2> 将Nginx-http-concat模块放到Nginx的源码目录下
useradd nginx


<3> 源码编译Nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --http-log-path=/log/access.log --error-log-path=/log/error.log --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --add-module=nginx-http-concat --with-google_perftools_module
make && make install

<4> 启动nginx
./usr/local/nginx/sbin/nginx
报错:
./nginx: error while loading shared libraries: libprofiler.so.0: cannot open shared object file: No such file or directory  # 无法找到我们之前指定的库文件

解决方案:
vim /etc/ld.so.conf.d/gperftools.conf
    /usr/local/lib/
ldconfig        #重载我们的系统配置文件
nginx -V        #查看当前的Nginx开启的模块

nginx安装扩展

Nginx的平滑重启

如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,同时可以通过发送系统信号给Nginx主进程的方式来进行。不过重启之前,要确认Nginx配置文件(nginx.conf)的语法是正确的,否则Nginx将不会加载新的配置文件。通过以下命令可以判断Nginx配置文件是否正确:

./nginx  -t -c ../conf/nginx.conf
如果配置文件不正确,屏幕将会提示配置文件的第几行出错

nginx: [emerg] "access_log" directive is not allowed here in /usr/local/nginx/1.6.3/conf/nginx.conf:10
nginx: configuration file /usr/local/nginx/1.6.3/conf/nginx.conf test failed
如果配置文件正确:
nginx: the configuration file /usr/local/nginx/1.6.3/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/1.6.3/conf/nginx.conf test is successful

这时候,就可以平滑重启Nginx了
kill -HUP  Nginx主进程号
kill -HUP  `cat /usr/local/nginx/1.6.3/logs/nginx.pid`
当Nginx主进程HUP信号时,它会尝试先解析配置文件(如果没有配置文件,就会使用指定的,否者使用默认的),如果成功,就应用新的配置文件(例如,重新打开日志文件或监听的套接字)。之后,Nginx运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭套接字,但是继续为当前的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。如果新的配置文件应用失败,Nginx将继续使用旧的配置进行工作。

Nginx的信号控制

信号 相关功能
TERM INT 快速关闭
QUIT 从容关闭
HUP 平滑重启,重新加载配置文件
USR1 重新打开日志文件,在切割日志时用途较大
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程

Nginx的日志切割(编写bash脚本实现)

#!/bin/bash

log_dir='/log/'
log_name1='linux.90daxue.com.log'
nginx_pid_dir='/usr/local/nginx/1.6.3/logs/nginx.pid'

mv {log_dir}{log_name1} {log_dir}{log_name1}_`date -d "-1 day" +%Y_%m_%d`
kill -USR1 `cat ${nginx_pid_dir}`

配置nginx:重点

1、nginx日志的设置
与Nginx日志相关的指令主要有两条,一条是log_format,用来设置日志的格式。另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。两条指令在Nginx配置文件中的位置可以在http{....}之间,也可以在虚拟主机之间,即server{....}之间。

用log_format指令设置日志格式,语法如下:
log_format  name  format [format ...]
其中name表示定义的格式名称,format表示定义的格式样式。log_format有一个默认的、无需设置的combined日志格式设置,combined的日志格式如下:
log_format  combined  'remote_addr - remote_user [time_local]'                       '"request" status body_bytes_sent '
                      '"http_referer" "http_user_agetn"';

可以自定义一份日志的记录格式,不过要注意,log_format指令设置的name名称在Nginx配置文件中是不能重复的。

如果Nginx服务器作为Web服务器,位于负载均衡设备、Squid反向代理的之后,就不能获取到客户端的真实IP地址了。原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP,通过remote_addr变量拿到的将是反向代理服务器的IP地址。但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。这个时候要用log_format指令来设置日志格式,让日志记录X-Forwarded-For信息中的IP地址,即客户的真实IP,设置如下 log_format  mylogformat  'http_x_forwarded_for - remote_user [time_local] '
                         '"request"  status body_bytes_sent '                          '"http_referer" "$http_user_agent"'

2.access_log指令的语法如下:
access_log path  [format  [buffer=size  | off]]
path:指定日志路径
format:指定日志格式
buffer:指定日志内存缓冲区大小

如:access_log  /log/access.log  mylogformat  buffer=32k;
日志格式样式 功能作用
remote_addr和http_x_forwarded_for 用于记录IP地址
$remote_user 用于记录远程客户端用户名称
$time_local 用于记录访问时间与时区
$request 用于记录请求URL与HTTP协议
$status 用于记录请求状态
$body_bytes_sent 用于记录发送给客户端的文件主体内容大小
$http_referer 用于记录是从哪个页面链接访问过来的
$http_user_agent 用于记录客户端浏览器的相关信息

Nginx主配置文件的详解(优化后的nginx.conf)

user  nginx nginx;                #运行nginx的用户和组
worker_processes  8;              #允许启动的nginx进程数
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;   #为每个nginx进程绑定cpu,将8个nginx进程绑定到8个cpu上


worker_rlimit_nofile 102400;   #这个指令是指当一个Nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与Nginx进程数相除,但是Nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

client_header_buffer_size 4k;  #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,以便一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k;所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得

open_file_cache max=102400 inactive=20s;  #这个将为打开文件指定缓存,默认是没有启用,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没有被请求后删除缓存。

open_file_cache_valid 30s; #这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;  #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是缓存中打开的,如上例,如果有一个文件在inactive时间内没有使用,它将被移除。


error_log  /log/nginx/error.log  error;   指定错误日志存放的路径,错误日志记录级别可选项为[ debug |info | notice | warn | error | crit ]

google_perftools_profiles /tmp/tcmalloc;     #做了nginx下的Google-perftools优化


events {
    use epoll;          #使用epoll的I/O模型
    multi_accept on;    #(告诉nginx收到一个新的连接通知后接受尽可能多的连接)是否允许一次性地响应多个用户请求,
    worker_connections  204800;     #每个进程允许的最大连接数
}

http {
    include       mime.types;                  #加载媒体类型
    default_type  application/octet-stream; 

    #charset gb2312    设置使用的字符集,如果一个网站有多种字符集,请不要随便设置,应让程序员在HTML代码中通过Meta标签设置   

    access_log /dev/null;    #不记录全局访问日志

    client_max_body_size 8m   设置客户端能够上传的文件大小

    sendfile       on;       #sendfile是Linux2.0+退出的一个系统调用,可以避免数据经过用户层,以此可以减少上下文切换次数,和数据拷贝次数。开启这项功能可以优化web服务器,从硬盘读取数据直接传送到网络的性能

    tcp_nopush     on;       #这个参数原理比较复杂,待定

    keepalive_timeout  65;   #设定长连接超时时长


    #压缩配置(主要是为了提高数据传输速度)

    gzip  on;                #开启nginx的gzip压缩,gzip压缩功能就是可以让你节省不少宽带,并加快传输速度,但是会增加服务器CPU的开销。
    gzip_disable "msie6";  #禁用IE6的gzip压缩,IE6的某些版本对gzip的压缩支持很不好,会照成页面的假死,测试发现对img进行gzip压缩后会照成IE6的假死。

    gzip_proxied any;      #对所有的代理结果数据无条件启动压缩
    gzip_min_length 1000;  #规定大于1K的页面才启动压缩(为了避免页面过小,数据可能会越压越大)
    gzip_comp_level 4;     #定义gzip的压缩比   1:压缩比最小,处理速度最快,9:压缩比最大但处理最慢(传输快但比较消耗CPU)

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;   #指定需要压缩的MIME类型,"test/html"类型总是会被压缩的。

    gzip_vary on;    #与http头有关系,价格vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持。因此,为了避免浪费不支持的也压缩,需要根据客户端的HTTP头来判断,是否需要压缩(这个理论不太确定),一般用于squid做反向代理是gzip压缩失效。

    open_file_cache max=100000 inactive=20s;   #缓存打开文件描述的文件大小和修改时间信息、存在的目录信息、搜索文件的错误信息:文件不存在 无权限读取等信息。 max指定缓存数量  inactive是指经过多长时间文件没有被请求后删除缓存。这里指定的是20s,所以等到至少20s不访问这个文件,相应缓存的这个文件的更改信息才会被删除

    open_file_cache_valid 30s;
    #这个是指多长时间检查一次缓存的有效信息。也就是说即使我一直访问这个文件,30s后会检查此文件的更改信息是否改变,发现变化就更新。

    open_file_cache_min_uses 2;
    #这个指令指定了open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cached中总是打开状态。


    open_file_cache_errors on;
    #这个指令是否在搜索一个文件是记录cached错误。

Nginx深度学习》有9个想法

  1. Hi, Neat post. There is a problem along with your site in internet explorer, may check this¡K IE still is the marketplace chief and a good component to folks will omit your great writing because of this problem.

  2. I have been surfing online greater than three hours nowadays, but I by no means found any attention-grabbing article like yours. It’s pretty value sufficient for me. In my opinion, if all website owners and bloggers made good content material as you did, the internet will probably be much more helpful than ever before. “When you are content to be simply yourself and don’t compare or compete, everybody will respect you.” by Lao Tzu.

  3. zxkdalkdnkm,A fascinating discussion is definitely worth comment. I do think that you ought to publish more on this topic, it may not be a taboo nkhwekv,subject but generally folks don’t talk about such subjects. To the next! All the best!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注