Nginx优化之php-fpm使用socket方式连接提高性能

在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果确实比较好。

注意路径,由于每个人的环境配置不同路径也可能不同.

将TCP改成socket方式的配置方法:

第一步: 修改php-fpm.conf

;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock

第二步:修改nginx配置文件server段的配置,将http的方式改为socket方式

location ~ [^/].php(/|$) {
    #fastcgi_pass 127.0.0.1:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}

第三步:重启php-fpm与nginx

service nginx restart
service php-fpm restart
ls -al /dev/shm

可以看到php-cgi.sock文件unix套接字类型。

如何隐藏Linux中的Nginx服务器版本

在这篇简短的文章中,我们将向您展示如何在错误页面和Linux的“ 服务器HTTP ”响应头字段中隐藏Nginx服务器版本。 这是保护您的Nginx HTTP和代理服务器的主要推荐实践之一。

另请参阅 : 如何隐藏Apache版本号和其他敏感信息

本指南假设您已经在您的系统上安装了Nginx,或者根据您的Linux发行版遵循以下任何教程来设置完整的LEMP:

如何在Debian 9 Stretch上安装LEMP(Linux,Nginx,MariaDB,PHP-FPM)
如何在FreeBSD上安装Nginx,MariaDB和PHP(FEMP)
如何在16.10 / 16.04安装Nginx,MariaDB 10,PHP 7(LEMP)
在RHEL / CentOS 7/6和Fedora上安装最新的Nginx 1.10.1,MariaDB 10和PHP 5.5 / 5.6
“ server_tokens ”指令负责在错误页面和“服务器”HTTP响应头字段中显示Nginx版本号和操作系统,如下图所示。

Nginx版本号

要禁用此功能,您需要关闭/etc/nginx/nginx.conf配置文件中的server_tokens指令。

# vi /etc/nginx/nginx.conf
OR
$ sudo nano /etc/nginx/nginx.conf

在下面的屏幕截图中将下面的行添加到http上下文中作为shwon。

server_tokens off;

Nginx+Tomcat实现负载均衡

如题所说,今天说一说如何使用Nginx和Tomcat实现反向代理及负载均衡。

1、Nginx是俄罗斯人开发的一种高性能的http反向代理服务器,Tomcat则是Apache基金会免费开源的一种web服务器,这两者结合即可实现web服务的反向代理和负载均衡。

2、那么,直接来看一看怎么实现吧:

1)、工具准备:nginx1.12.0、两个同版本的tomcat(我用的是tomcat8).

2)、分别修改两个tomcat的默认端口配置并启动好这两个tomcat,找到tomcat的server.xml文件,分别修改端口配置如下:
第一个tomcat如下配置端口:

<Server port="8005" shutdown="SHUTDOWN">
<Connector connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

第二个tomcat如下配置端口:

<Server port="8006" shutdown="SHUTDOWN">
<Connector connectionTimeout="20000" port="9999" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>

端口配置好以后,分别启动起来先放着。

3)、接下来就要配置nginx的反向代理和负载均衡了,下载地址:http://nginx.org/en/download.html,具体配置还是找到nginx的配置文件nginx.conf如下配置:

upstream server_lb {
    #以下标识启动的那两个tomcat,端口号对应,weight标识分配的权重
    server 127.0.0.1:8888 weight=10;
    server 127.0.0.1:9999 weight=5;
}

server {
    #监听nginx的默认端口号80
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        #这一句很重要,意思是当用户访问localhost上的80端口时转发到以上定义的两个tomcat
    proxy_pass http://server_lb;
        index  index.html index.htm;
    }
}

4)、接下来就是要启动nginx服务器了,直接双击nginx这个应用程序就可以启动了。

5)、然后访问:http://localhost:80,因为第一个tomcat配置的权重是第二个tomcat权重的2倍,所以每次访问都会是第一个tomcat优先被访问2次,第三次第二个tomcat才会被访问到。

注:本篇文章由ECode1024原创撰写,未经允许,不得修改转载,否则追究相关责任。
ECode1024,一个分享软件与编程知识的精简网站。

Nginx root和alias的区别

root的使用

  location /assets/ {
    root /git/shortUrl/dist/;
  }

当user访问 http://domain/assets/a.js 时,nginx把请求映射为/git/shortUrl/dist/assets/a.js

alias的使用

  location /assets/ {
    alias /git/shortUrl/dist/;
  }

当user访问 http://domain/assets/a.js 时,nginx把请求映射为/git/shortUrl/dist/a.js

nginx 的限制连接模块limit_zone与limit_req_zone

nginx 上有两个限制连接的模块一个是 limit_zone 另一个是 limie_req_zone,两个都可以限制连接,但具体有什么不同呢?

下面是 nginx 官网上给的解释

limit_req_zone
Limit frequency of connections from a client. 
This module allows you to limit the number of requests for a given session, or as a special case, with one address.
Restriction done using leaky bucket. 

limit_zone
Limit simultaneous connections from a client. 
This module makes it possible to limit the number of simultaneous connections for the assigned session or as a special case, from one address. 

按照字面的理解,lit_req_zone的功能是通过 令牌桶原理来限制 用户的连接频率,(这个模块允许你去限制单个地址 指定会话或特殊需要 的请求数 )
而 limit_zone 功能是限制一个客户端的并发连接数。(这个模块可以限制单个地址 的指定会话 或者特殊情况的并发连接数)
一个是限制并发连接一个是限制连接频率,表面上似乎看不出来有什么区别,那就看看实际的效果吧~~~

在我的测试机上面加上这两个参数下面是我的部分配置文件

http{
limit_zone one  $binary_remote_addr  10m;
#limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
server
{
 ......
limit_conn   one  1;
#limit_req   zone=req_one  burst=120;
......
}
    }

解释一下 limit_zone one $binary_remote_addr 10m;

这里的 one 是声明一个 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr 的变量,10m 是会话状态储存的空间

limit_conn one 1 ,限制客户端并发连接数量为1

先测试 limit_zone 这个模块

我找一台机器 用ab 来测试一下 命令格式为

ab -c 100 -t 10 http://192.168.6.26/test.php

test.php 内容是phpinfo

看看日志里的访问

未分类

看来也不一定能限制的住1秒钟1个并发连接,(有网友跟我说这是因为测试的文件本身太小了才会这样,有时间一定测试一下),从日志里面可以看得出来 除了几个200以外其他的基本都是503,多数并发访问都被503了。

我又用ab多运行了一会儿,发现另一种情况

未分类

似乎随着数量的增多效果也会发生一些变化,并不是完全达到模块说明中的效果

看看当前的tcp连接数

# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 29
FIN_WAIT1 152
FIN_WAIT2 2
ESTABLISHED 26
SYN_RECV 16

这次测试下 limit_req_zone,配置文件稍微改动一下

http{
#limit_zone one  $binary_remote_addr  10m;
limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
server
{
......
#limit_conn   one  1;
limit_req   zone=req_one  burst=120;
......
}
}

restart 一下 nginx

简单说明一下, rate=1r/s 的意思是每个地址每秒只能请求一次,也就是说根据令牌桶(经过网友冰冰的指正应该是漏桶原理)原理 burst=120 一共有120块令牌,并且每秒钟只新增1块令牌,
120块令牌发完后 多出来的那些请求就会返回503
测试一下

ab -c 100 -t 10 http://192.168.6.26/test.php

看看这时候的访问日志

未分类

确实是每秒请求一次,那多测试一会儿呢?把时间从10秒增加到30秒

未分类

这个时候应该是120 已经不够用了,出现很多503,还有两种情况会出现,请看图

未分类

这种情况很像是 在队列里的一些请求得不到响应而超时了,但我不确定是不是这种情况。

未分类

客户端自己等不及断开了,返回499

看看当前的tcp连接数

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, 
S[a]}'
TIME_WAIT 51
FIN_WAIT1 5
ESTABLISHED 155
SYN_RECV 12

虽然这样会让nginx 一秒钟只处理一个请求,但是仍然会有很多还在队列里面等待处理,这样也会占用很多tcp连接,从上面那条命令的结果中就能看得出来。

如果这样呢

limit_req   zone=req_one  burst=120 nodelay;

加上 nodelay之后超过 burst大小的请求就会直接 返回503,如图

未分类

也是每秒处理1个请求,但多出来的请求没有象刚才那样等待处理,而是直接返回503。

当前的tcp连接

# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 30
FIN_WAIT1 15
SYN_SENT 7
FIN_WAIT2 1
ESTABLISHED 40
SYN_RECV 37

已连接的数量比上面的少了一些
通过这次测试我发现 这两种模块都不能做到绝对的限制,但的确已经起到了很大的减少并发和限制连接的作用,在生产环境中具体用哪种或者需要两种在一起使用就要看各自的需求了。

web网站性能优化:nginx开启GZIP压缩网页,JS,CSS

提高web网站性能优化,nginx开启GZIP压缩网页,JS,CSS,从而可以节约大量的带宽,提高传输效率,但是会消耗cpu资源,自己可以权衡一下,总体来说开启是值得的。

在nginx的nginx.conf的 http { } 里添加如下配置

nginx开启的配置:

gzipon;  #开启gzip
gzip_min_length 1024;  #低于1kb的资源不压缩,
gzip_comp_level 3; #压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右。
gzip_types text/plainapplication/javascriptapplication/x-javascripttext/javascripttext/xmltext/css;  #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片,下面会讲为什么。
gzip_disable "MSIE [1-6].";  #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;  #是否添加“Vary: Accept-Encoding”响应头

保存并重启nginx,刷新页面(为了避免缓存,请强制刷新)预览器上就能看到效果了。

火狐预览器:

未分类

谷歌预览器:

未分类

再去站长之家检查Seo:

未分类

可以看到压缩率100%,可怕,震惊!

注意几点:

(1)在gzip_http_version的默认值是1.1,就是说对HTTP/1.1协议的请求才会进行gzip压缩。
如果使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的。
如果使用nginx通过反向代理做Cache Server,前端的nginx没有开启gzip,且后端的nginx上未设置gzip_http_version为1.0,那么Cache的url将不会被gzip压缩。

(2)gzip_min_length :从上图可以看到最后一个js大小不到1K所以是不压缩的,倒数第二个js来源第三方所以也不进行压缩。
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024。

(3)gzip虽然好用,但是一下类型的资源不建议启用。图片类型,因为图片如jpg、png本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。

大文件,因为会消耗大量的cpu资源,且不一定有明显的效果。

Nginx自建CDN与ngx_cache_purge清除缓存

Nginx自建CDN在 https://www.xiaoz.me/archives/8775 已经介绍过,有兴趣的童鞋可参考,不过可以在这篇文章基础上继续完善,比如添加ngx_cache_purge模块来清除缓存。

未分类

编译ngx_cache_purge模块

清理Nginx缓存需要ngx_cache_purge模块帮助,可输入命令nginx -V查看已经编译的模块,如果没有ngx_cache_purge说明模块没有安装,则需要重新编译一下Nginx

未分类

模块下载地址为 http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz ,如何编译Nginx可参考: https://www.xiaoz.me/archives/7126

配置ngx_cache_purge

在server段内加入下面的配置,并重载Nginx,在这里xiaoz被坑了很久,下面的cache_one请与keys_zone定义的值保持一致,否则nginx将无法启动。

location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}

如果想清理缓存,添加purge参数即可,如https://www.xiaoz.me/purge/xxx.png,如果该文件存在缓存,则会提示如下截图。若不存在缓存,则返回404,若无论什么情况均返回404,可能配置没成功。

未分类

WordPress自动刷新缓存

小z博客使用的Wordpress程序,如果启用CDN后页面被缓存,用户提交评论后无法马上显示出来,可以使用Ajax异步请求ngx_cache_purge接口,当用户提交评论的时候则清除该页面缓存。只需要下面的这段js添加到footer.php即可。

<script>
        $(document).ready(function(){
            $("#submit").click(function(){
                var uri = "https://www.xiaoz.me/purge" + window.location.pathname;
                $.get(uri,function(data,status){
                    return true;
                });
            });
        });
    </script>

代码中的https://www.xiaoz.me请改成您自己的域名,以下是小z博客CDN完整配置,仅供参考:

proxy_cache_path /data/caches levels=1:2 keys_zone=xiaozcdn:100m inactive=30m max_size=100m;
server
    {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    ssl_certificate /xxx/www_xiaoz_me.crt;
    ssl_certificate_key /xxx/www_xiaoz_me.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;

    server_name     www.xiaoz.me;
    charset utf-8,gbk;

    #删除缓存
    location ~ /dcache(/.*) {
    allow all;
    proxy_cache_purge xiaozcdn $proxy_host$1$is_args$args;
    error_page 405 =200 /purge$1;
    }

       location / {
       #proxy_set_header Accept-Encoding "";
       proxy_pass https://www.xiaoz.me;
       proxy_redirect off;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_cache xiaozcdn;
       proxy_cache_valid  200 304  30m;
       proxy_cache_valid  301 24h;
       proxy_cache_valid  500 502 503 504 0s;
       proxy_cache_valid any 1s;
       #达到第几次被缓存?
       proxy_cache_min_uses 1;
       expires 12h;
       proxy_cache_key    $uri$is_args$args;
    }
}
server
{
    listen 80;
    server_name www.xiaoz.me;
    rewrite ^(.*) https://www.xiaoz.me$1 permanent;
}

总结

Nginx应用十分广泛,功能也非常强大,但是参数繁多,xiaoz所了解的不过九牛一毛。上述方案已经应用到小z博客中,具体效果有待观察和改进,若有问题请反馈。

Nginx purge_cache出现404的问题

最近给自建CDN添加了purge_cache模块,用于清除CDN缓存,添加后出现404,网上搜了一大堆都不符合我的情况,最终用Google搜索英文关键词解决。

解决办法

我原本的配置是这样的,看起来似乎并无问题,但是访问http://www.xiaoz.me/purge/1.jpg出现404

location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $host$1$is_args$args;
error_page 405 =200 /purge$1;
}

最终发现是一个参数的原因,由于我是Nginx反向代理自建CDN,$host参数需要修改为$proxy_host,修改后的配置如下,最终得以解决。

location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}

修改php-fpm和nginx运行用户

(php)项目a是用test用户运行
nginx和php-fpm是www-data用户运行
(python)项目b是用test用户运行

项目a通过php函数exec调用python脚本的接口造成了没有权限访问目录

直接把项目b的权限切换为www-data可以执行,但是不便于开发,最好是把php、nginx、项目a、项目b都在一个用户、组下面。

打个比方test是当前登录用户
修改nginx的运行角色

cd /etc/nginx
sudo vi nginx.conf
# 头部是这样
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

# 修改为
user test;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

# 重启nginx
sudo service nginx restart

修改php的运行角色

cd /etc/php/7.0/fpm/pool.d/
sudo vi www.conf
# 找到
user = www-data
group = www-data

# 改为
user = test
group = test

cd /run/php/
ls -al
# 这个目录下面有两个文件
# php7.0-fpm.pid和php7.0-fpm.sock
# 修改这两个文件的权限
sudo chown test:test php7.0-fpm.pid
sudo chown test:test php7.0-fpm.sock

# 重启php-fpm
sudo service php7-fpm restart

test用户是杜撰出来的根据自己的当前用户修改。

Nginx SSL安全性增强,HTTPS网站轻松快速获得A+评级

从 HTTP 到 HTTPS 只需要一个SSL证书,而在安装 SSL 证书后,如何在 Qualys SSL Labs 网站获得更高的安全评级呢?该如何增强 SSL 安全性呢?

未分类

子凡下面就通过对 Nginx 服务器设置的 SSL 安全机制与大家做个简单的分享,还记得之前子凡分享过 HSTS 安全协议配置,可以简单从 HTTP 到 HTTPS 的安全高效转移,而今天给大家说的有共同之处,也更为全面。

未分类

通过禁用 SSL 压缩来降低 CRIME 攻击威胁;禁用协议上存在安全缺陷的 SSLv3 及更低版本,并设置更健壮的加密套件cipher suite来尽可能启用前向安全性Forward Secrecy;此外还启用了 HSTS 和 HPKP。这样我们就拥有了一个健壮而可经受考验的 SSL 配置,并可以在 Qually Labs 的 SSL 测试中得到 A 级及以上评分。

#Nginx SSL安全性增强
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

以上便是子凡目前在用的一个简单配置,通过在原有的服务器配置文件中添加以上信息就瞬间从之前的A-评价获得了A+,实现了 Nginx 服务器的 SSL 安全性增强配置。

同样我们还可以通过 https://cipherli.st 找到 Apache 和 Lighttpd 的安全设置,同样也有 Nginx 的安全设置,只是可能与以上子凡提供的有所区别,将其复制粘帖到服务器相关的配置文件中保存即可。

最后配置好后,我们便可通过 https://www.ssllabs.com/ssltest 进行评级测试。