Linux Nginx + PHP 安装及调优


W1234
爱吃汉堡包 2022-09-27 09:52:19 52287
分类专栏: 资讯

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

 

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=10588
赞同 0
评论 0 条
爱吃汉堡包L0
粉丝 0 发表 9 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2951
【软件正版化】软件正版化工作要点  2872
统信UOS试玩黑神话:悟空  2833
信刻光盘安全隔离与信息交换系统  2728
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1261
grub引导程序无法找到指定设备和分区  1226
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  165
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  163
点击报名 | 京东2025校招进校行程预告  163
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  159
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
如何玩转信创开放社区—从小白进阶到专家 15
信创开放社区邀请他人注册的具体步骤如下 15
方德桌面操作系统 14
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
我有15积分有什么用? 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!