一个普通的LNMP优化方案

一、前言

 系统:debian11 4H4G

 linux面板:mdserver-web,宝塔理论类似也可参考

 本文仅供参考。本人偏小白,文章可能对于服务器的普通用户优化性能有参考意义……大佬忽略即可

 如果更好的方案和纠正,可评论告知,感谢大佬

二、OpenResty 1.25.3.1

1.前言

 基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。性能更好

 此版本,对应nginx1.25,支持http3(虽然我服务器封堵了udp用不了)网站配置与之前http2监听不同,详见网站配置部分

 配置方案相对激进,仅供参考

2.外置模块:

ngx_brotli压缩
MW面板|openresty添加br压缩

 Brotli是开源的一种新型压缩算法,Brotli压缩比Gzip压缩性能更好。开启Brotli压缩功能后,CDN节点会对资源进行智能压缩后返回,缩小传输文件大小,提升文件传输效率,减少带宽消耗。

3.性能调整

4.配置修改:

 ❶添加内容

worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;

 worker_processes表示worker线程的数量,推荐设置为CPU内核数;

 worker_cpu_affinity表示绑定Nginx的worker进程到指定的CPU内核,使每一个worker进程都独享一个CPU,就在内核的调度策略上实现了完全的并发,一般2内核可设置为10 01,4内核可设置为1000 0100 0010 0001。

    brotli on;
    brotli_comp_level 6;
    brotli_static always;
    brotli_min_length 1k;
    brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 8;
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
    gzip_vary on;
    gzip_proxied   expired no-cache no-store private auth;
    gzip_disable   "MSIE [1-6]\.";

注:此处添加了br压缩相关参数,如果没有启用br压缩,忽略这部分

 brotli_comp_level,压缩级别,可选值范围为0~11,默认值为6;

 brotli_min_length,响应数据的最小长度,低于该值将不使用brotli算法执行压缩操作;

 brotli_static,是否允许查找预处理好的、以.br结尾的压缩文件;

 brotli_types,动态压缩启用时,允许压缩的MIME types;

 ❷修改内容

worker_rlimit_nofile 512000;

注:此项请设置为小于等于linux系统最大打开文件数

 worker_rlimit_nofile表示Nginx worker进程可以打开的最大句柄描述符个数,更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。

三、Mariadb 10.11.6

1.前言

 MariaDB是MySQL关系数据库管理系统的一个分支,由社区开发,有商业支持,旨在继续保持在GNU GPL下开源。MariaDB打算保持与MySQL的高度兼容性,与MySQL API和命令精确匹配。

 两者在功能上的主要区别在于存储引擎,MySQL默认使用InnoDB存储引擎,而MariaDB默认使用XtraDB(Aria)存储引擎,这是基于InnoDB开发的,并进行了一些优化和改进,支持InnoDB数据全文搜索。

 10.11版本大致对应mysql8.0,基本可视为mysql8.0的有限替代,mariadb与mysql的主要差距可能在查询性能更好一些( 不是 ,好像是这样),如果你网站不用redis缓存(会失去一定的动态性),那mariadb可能会好一些

 配置视为不用MyISAM或很少、配置方案相对激进,仅供参考

2.性能优化


 key_buffer_size只对MyISAM表起作用,如果不使用MyISAM表,可相对降低;

 Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整;

 tmp_table_size 控制内存临时表的最大值,超过限值后就往硬盘写,写的位置由变量 tmpdir 决定;

 innodb_buffer_pool_size,innodb索引用,主要缓存innodb表的索引,数据,插入数据时的缓冲。为Innodb加速优化首要参数;

 innodb_log_buffer_size,日志缓冲,表示InnoDB写入到磁盘上的日志文件时使用的缓冲区的字节数,默认值为16M。一个大的日志缓冲区允许大量的事务在提交之前不用写日志到磁盘,所以如果有更新,插入或删除许多行的事务,则使日志缓冲区更大一些可以节省磁盘IO;

 read_buffer_size为需要全表扫描的MYISAM数据表线程指定缓存,理论只用于MYISAM,所以不用MYISAM可适当缩小;

 read_rnd_buffer_size该变量可以被任何存储引擎使用,当从一个已经排序的键值表中读取行时,会先从该缓冲区中获取而不再从磁盘上获取;

 Thread_stack:每个连接线程被创建时,MySQL给它分配的内存大小。当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息;

 max_connections最大并发连接,每个连接的用户均算作一个连接,增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;

 可根据当前状态给出的信息更详细的优化(我也不是太会)

3.配置文件修改项

 我的网站图片及随机图api依赖panIndex缓存世纪互联直链,并且基本缓存更新时长>24h,查询缓存给充足可能有更好的效果

query_cache_type = 1
query_cache_size = 128M

四、PHP 8.3.4

1.前言

 我主要用到的吃内存的就PHP和mariadb,所以配置给的相当充足,并且系统的redis用在了这里

 配置方案相对激进,仅供参考

2.额外添加扩展

 在 安装扩展 处安装redis、opcache,卸载memcache、memcached(有用到memcache那就不卸,不过memcached和redis好像不能共用)

3.配置修改及性能调整

 内存相对充足,又想性能高一些,那就适当增大脚本内存限制

 内存充足,直接静态提性能,我设置为了60并发(虽然实际根本用不到这么高的并发,毕竟我博客交互基本都在artalk评论)

 内存不充足的情况下应该克制一点,防止内存爆炸。并发量和日访问量是两个概念,所谓并发可以简单理解为同一秒访问网站的客户数量,假设并发设置为50(即每秒同时访问50次),那么1分钟就可以有 3000 的访问量。但也不是说并发设置的越大就越好,如果并发数设置过大,被 CC 攻击时服务器宕机挂掉的可能性也十分的高,建议并发数设置不要超过 300

 一般4G内存的云服务器,设置30~80并发就可以。

4.配置文件处修改

 增强一点opcache

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256
# 给opcache分配的内存
opcache.interned_strings_buffer=16
# 分配的字符串驻留内存
opcache.max_accelerated_files=10000
# 允许缓存的文件数量以及大小
opcache.revalidate_freq=600
# 参数启用时,OPcache 会在每个请求中检查脚本文件的时间戳以确定是否重新缓存。
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.jit=1205
opcache.jit_buffer_size=64M
opcache.save_comments=0
opcache.blacklist_filename=/www/server/php/opcache-blacklist.txt

 opcache用于缓存PHP脚本的解释代码,从而提高PHP应用程序的性能。当PHP脚本首次被解释执行时,PHP 将脚本编译成一组中间代码,并在运行时执行这些opcode。OPcache的作用是缓存这些opcode,避免在每次请求时都重新解释和执行相同的脚本。

5.会话管理

 会话管理设置为redis并连接,这个就不放图了,根据配置自己填就行了

 php默认的会话是保存在硬盘里面的,如果你不是SSD硬盘,可以保存在redis或者Memcached里面,性能可能会有一定提升

判断SSD和HDD
Linux下判断磁盘是SSD还是HDD的几种方法

五、Redis 7.2.2

1.前言

 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。最大的优势在于不会丢失数据,进程的数据仍然在磁盘有存储

 这里我主要用PHP的会话管理,配置方案相对激进,仅供参考

2.性能调整

 只有php再用,就让连接尽量更稳定一些

3.配置修改

tcp-keepalive 600

 tcp-keepalive定时检测对端是否断开

六、网站配置

1.前言

 我也在摸索中,下面给出一些重要的部分参考,以echs.top网站的配置文件为例

2.配置文件

server
{
    listen 80 default_server;
    listen 443 ssl;
    listen 443 quic reuseport;
    listen [::]:443 ssl;
    listen [::]:443 quic reuseport;
    http2 on;
    # 此处只需一个站点有default_server、reuseport,并且在旧版1.2系的nginx此处配置略不同注意区分
    server_name echs.top blog.echs.top;
    index index.php index.html;
    root /www/wwwroot/echs.top/;

    # error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    # HTTP_TO_HTTPS_END
    # SSL-START
    ssl_certificate    /www/server/web_conf/ssl/echs.top/fullchain.pem;
    ssl_certificate_key  /www/server/web_conf/ssl/echs.top/privkey.pem;
    # 证书文件路径,如果你泛域名证书,完全可以所有网站相同路径,这样每次只用更新一个文件
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets on;
    ssl_protocols TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    # 不同的ssl证书和tls版本设置可能大不相同,我也不是太清楚
    # SSL-END
    # HTTP3提示-START
    ssl_early_data on;
    add_header Alt-Svc 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"';
    # 貌似是提醒浏览器网站已经开启了HTTP3
    # HTTP3提示-END
    # HSTS-START
    add_header Strict-Transport-Security "max-age=63072000" always;
    # 应该理解为提醒浏览器此网站请完全用HTTPS访问
    # HSTS-END
    # OSPf-START
    ssl_stapling on;
    ssl_stapling_responder http://ocsp.globalsign.com/alphasslcasha256g4;
    ssl_stapling_verify on;
    ssl_trusted_certificate /www/server/web_conf/ssl/echs.top/fullchain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=3600s ipv6=off;
    resolver_timeout 4s;
    # OCSP Stapling,优化ssl握手速度的配置,我是国外服务器,这里仅供参考
    # OSPf-END
    error_page 497  https://$host$request_uri;
    
    #301-START
    include /www/server/web_conf/nginx/redirect/echs.top/*.conf;
    #301-END
    
    #PROXY-START
    include /www/server/web_conf/nginx/proxy/echs.top/*.conf;
    #PROXY-END
    
    #ERROR-PAGE-START
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    
    #PHP-INFO-START
    include /www/server/web_conf/php/conf/enable-php-83.conf;
    #PHP-INFO-END
    
    #REWRITE-START
    include /www/server/web_conf/nginx/rewrite/echs.top.conf;
    #REWRITE-END
    
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
    location ~ .*\\.(webp|gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        expires 30d;
        error_log /dev/null; 
        access_log /dev/null;
    }
    
    access_log  /www/wwwlogs/echs.top.log main;
    error_log   /www/wwwlogs/echs.top.error.log;
}

 注意在最新版本nginx/1.25中listen选项中的http2参数已经被删除了,要开启http2使用选项http2 on;代替,而在旧版nginx中http监听段配置与上方不同

 在nginx1.25以上支持http3版本中如下

    listen 80;
    listen 443 ssl;
    listen 443 quic;
    listen [::]:443 ssl;
    listen [::]:443 quic;
    http2 on;

 在不支持http3的nginx版本中如下(一般为nginx1.25以下)

    listen 80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    listen [::]:80;

 ssl_protocols推荐配置TLSv1.2 TLSv1.3 去除TLSv1及1.1的支持, 现在基本已经很难见到只支持TLSv1和1.1协议的客户端设备了

 ssl_session_timeout ssl会话超时时间可以设定为1d一天, 可极大的减少ssl握手所消耗的cpu算力

 ssl_session_cache 会话缓存大小设置为多进程共享 shared:SSL:10m; 根据服务器内存大小可以适当再增大缓存

 ssl_session_tickets 关闭无服务器端状态的传输层安全(TLS)会话恢复, 默认开启

 ssl_prefer_server_ciphers 关闭要求服务器密码优先于客户端密码保证一定程度兼容性.(默认关闭)

 ssl_ciphers推荐在下方SSL Config Generator生成

 更多内容就不做详细解释了直接参考更多内容及上方标注配置即可

3.更多内容

SSL Config Generator
ssl相关参数生成,我个人推荐ssl部分参考这个
OCSP Stapling
Nginx配置OCSP,增强服务器安全
证书链补全
缺少证书链的问题和解决办法


 

参考文章
秒懂!四步16点高效搞定高性能web服务器nginx | https://cloud.tencent.com/developer/article/1360916
NGINX快速入门(06)Nginx性能参数调优 | https://zhuanlan.zhihu.com/p/505325658?utm_id=0
[技术教程]宝塔Nginx开启支持HTTP3/QUIC协议 - 简易教程 | https://www.toubiec.cn/1304.html
php项目上线优化 | https://zlhdsg.com/archives/2097
php.ini配置文件优化总结 | https://www.jingxialai.com/3753.html
1 Core 1 GB Memory小服务器WordPress调优小记 | https://zhwebsite.com/2023/01/24/1-core-1gb-memory%E5%B0%8F%E6%9C%8D%E5%8A%A1%E5%99%A8wordpress%E8%B0%83%E4%BC%98%E5%B0%8F%E8%AE%B0/
mariadb 内存占用优化 | https://zhuanlan.zhihu.com/p/55528791?utm_id=0
Nginx HTTPS 配置解析 SSL安全 ssl_ciphers 解析 | https://www.nenufm.com/dorthl/76/
SSL/TLS 握手优化详解 | https://www.cnblogs.com/zhengchunyuan/p/8427607.html
nginx集成brotli压缩算法 | https://www.cnblogs.com/jackieathome/p/17957264
大型网站高并发,php-fpm初始化管理配置 | https://zhuanlan.zhihu.com/p/681969278?utm_id=0
Linux宝塔面板高并发优化方案 | https://blog.csdn.net/qq15577969/article/details/125313549
Redis 配置文件说明 | https://www.cnblogs.com/zhoujinyi/p/5565647.html
Nginx配置OCSP,增强服务器安全 | https://www.lelexuan.cn/article/32

文章目录