Linux Nginx + PHP 安装及调优

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。

Nginx 的源代码使用 2-clause BSD-like license。

Nginx 是一个很强大的高性能Web反向代理服务,它具有很多非常优越的特性:

在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。


  • 安装 Nginx yum 源
  • rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  • 查看 /etc/yum.repos.d/nginx.repo 确保 enabled=1 为启用

  • 使用 yum 安装 Nginx

  • 编辑 vim /etc/nginx/conf.d/default.conf 配置文件

  • 这里要注意以下几点:
  • user nginx      #这里的用户要跟后面要使用的 PHP 设置的 user 一致
  • 去掉 location ~ \.php$  段的注释,使 Nginx 支持 PHP   
  • location ~ \.php$ {

        root           /usr/share/nginx/html;     #要使用绝对路径,注意目录的属主属组
        fastcgi_pass   127.0.0.1:9000;    #这里的设置要跟 PHP 配置文件中的一致
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; #要把 /scripts改为 $document_root 注意没有 /
        include        fastcgi_params;
    }

  • 修改目录属主属组


  • 暂时不启动 Nginx,先安装 PHP 7,要使用 yum epel 以及 remi 源
  • 具体设置请参见拙作:https://blog.csdn.net/gaofei0428/article/details/102903468

  • rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm

  • yum install -y --enablerepo=remi --enablerepo=remi-php74 php php-fpm php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-bcmath php-gd php-common --skip-broken

  • 编辑 vim /etc/php-fpm.d/www.conf 配置文件

  • user = nginx     #这里的 user 要跟 Nginx 配置文件 /etc/nginx/conf.d/default.conf 中设置的 user 一致
    group = nginx 

  • 这里的 listen 选项值要跟 Nginx 配置文件 /etc/nginx/conf.d/default.conf 中的 fastcgi_pass   127.0.0.1:9000; 一致
  • listen = 127.0.0.1:9000
    listen.allowed_clients = 127.0.0.1
  • PS:要么使用统一的 IP ,要么使用统一的 域名

  • 确认无误保存退出,启动 Nginx 和 PHP

  • 编辑 vim /usr/share/nginx/html/test.php

  • 打开浏览器 输入 IP 查看


Nginx 性能优化

  • Nginx 运行工作进程个数一般设置CPU的核心或者核心数x2
  • 查看 cpu 核心数
  • grep ^processor /proc/cpuinfo | wc -l
  • 编辑 /etc/nginx/nginx.conf

user  nginx;                            #指定Nginx用户,注意字段后面的 分号 ;
worker_processes  auto;        #指定Nginx启动的工作进程的数量,这里设置为 auto 根据需求自动调整
worker_rlimit_nofile 65535;     #配置nginx工作进程最大打开文件数
error_log  /var/log/nginx/error.log warn;    #指定错误日志名称及存放位置
pid        /var/run/nginx.pid;


events {
    worker_connections  65535;    #配置单个工作进程的最大连接数
    use epoll;   #选择事件驱动模型,Nginx支持众多的事件驱动,比如select、poll、epoll,只能设置在events模块中
    multi_accept on;    #打开同时接受多个新网络连接请求的功能。

    accept_mutex on;  #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒

}
http {
    include       /etc/nginx/mime.types;  #定义MIME-Type,Nginx作为Web服务器必须要能够识别全都请求的资源类型
    default_type  application/octet-stream;

    log_format logstash_json '{"@timestamp":"$time_iso8601",'  #自定义访问日志,将日志定义为json格式
        '"host":"$server_addr",'
        '"clientip":"$remote_addr",'
        '"size":$body_bytes_sent,'
        '"responsetime":$request_time,'
        '"upstreamtime":"$upstream_response_time",'
        '"upstreamhost":"$upstream_addr",'
        '"http_host":"$host",'
        '"url":"$uri",'
        '"domain":"$host",'
        '"xff":"$http_x_forwarded_for",'
        '"referer":"$http_referer",'
        '"agent":"$http_user_agent",'
        '"status":"$status"}';
    access_log /var/log/nginx/samsung1.access.log logstash_json;    #定义访问日志文件存放位置

    sendfile       on;    #配置允许sendfile方式传输文件
    sendfile_max_chunk 512k;  #用sendfile()传输的数据最大不能超出这个值,默认值为0表示无限制
    tcp_nopush     on;   #使用TCP_CORK套接字,该选项仅在使用sendfile的时候才开启

    keepalive_timeout  60;    #客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
    tcp_nodelay on;     #开启 Nagle算法,降低网络里小包的数量,从而提升网络性能,只在keep-alive启作用
    client_header_buffer_size 4k;    #客户端请求头部的缓冲区大小
    open_file_cache max=102400 inactive=20s;     #打开文件指定缓存,默认是没有启用的,max指定缓存数量
    open_file_cache_valid 30s;    #指定多长时间检查一次缓存的有效信息
    open_file_cache_min_uses 1;   #open_file_cache指令中的inactive 参数时间内文件的最少使用次数
    client_header_timeout 15;  #设置请求头的超时时间
    client_body_timeout 15;    #设置请求体的超时时间
    reset_timedout_connection on;    #告诉nginx关闭不响应的客户端连接
    send_timeout 15;     #响应客户端超时时间
    server_tokens off;            #隐藏 Ngxin 版本号
    client_max_body_size 10m;  #上传文件大小限制

    gzip  on;       #开启 gzip
    gzip_min_length 2k;     #设置允许压缩的页面最小字节数,建议设置成大于1K,如果小与1K可能会越压越大
    gzip_buffers   4 32k;    #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存
    gzip_http_version 1.1;    #压缩版本,用于设置识别HTTP协议版本,默认是1.1
    gzip_comp_level 6; #用来指定GZIP压缩比,1压缩比最小处理速度最快,9压缩比最大传输速度快但是处理慢,也比较消耗CPU资源
    gzip_vary on;    #开启varyheader支持,可以让前端的缓存服务器缓存经过GZIP压缩的页面
    gzip_proxied any;   #Nginx做为反向代理的时候启用,any – 无条件压缩所有结果数据

    include /etc/nginx/conf.d/*.conf;
}      #注意前后的 大括号 {}

  • 编辑 /etc/nginx/conf.d/default.conf 设置 expires 缓存调优

  • vim /etc/nginx/conf.d/default.conf

  • 主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,第一次打开加载慢一点,第二次,就非常快了!缓存的时候,将需要缓存的拓展名列出来, Expires缓存配置在 server 字段里面。

  • location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {      
    expires 30d;
    #log_not_found off;
    access_log off;
    }

    location ~* \.(js|css)$ {
    expires 7d;
    log_not_found off;
    access_log off;
    }

  • Nginx 防盗链   

location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
        valid_referers noneblocked http://192.168.10.2/*;
        if ($invalid_referer) {   
        return 404;
        break;
            }
        access_log off;
    }


  • Linux 系统内核参数优化

  • 编辑 vim /etc/sysctl.conf 
  • fs.file-max = 999999:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接数,需根据实际情况配置。

  • net.ipv4.tcp_max_tw_buckets = 6000 :这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。注:主动关闭连接的服务端会产生TIME_WAIT状态的连接

  • net.ipv4.ip_local_port_range = 1024 65000  :允许系统打开的端口范围。

  • net.ipv4.tcp_tw_recycle = 1 :启用timewait快速回收。

  • net.ipv4.tcp_tw_reuse = 1 :开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。

  • net.ipv4.tcp_keepalive_time = 30:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。

  • net.ipv4.tcp_syncookies = 1 :开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

  • net.core.somaxconn = 40960  :web 应用中 listen 函数的 backlog 默认会给我们内核参数的。

  • net.core.somaxconn  :限制到128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关。somaxconn定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。

  • net.core.netdev_max_backlog = 262144  :每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

  • net.ipv4.tcp_max_syn_backlog = 262144 :这个参数标示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。

  • net.ipv4.tcp_rmem = 10240 87380 12582912 :这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。

  • net.ipv4.tcp_wmem = 10240 87380 12582912:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。

  • net.core.rmem_default = 6291456:这个参数表示内核套接字接受缓存区默认的大小。

  • net.core.wmem_default = 6291456:这个参数表示内核套接字发送缓存区默认的大小。

  • net.core.rmem_max = 12582912:这个参数表示内核套接字接受缓存区的最大大小。

  • net.core.wmem_max = 12582912:这个参数表示内核套接字发送缓存区的最大大小。

  • net.ipv4.tcp_syncookies = 1:该参数与性能无关,用于解决TCP的SYN攻击。、

  • 系统连接数的优化

  • Linux 默认值 open files为1024
  • 编辑 /etc/security/limits.conf 在末尾添加,保存完需要重新登录生效: su - (另外 SSH 需要 开启 UsePAM)

*               soft     nofile     65535
*               hard    nofile     65535
*               soft     noproc   65535
*               hard    noproc   65535

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值