《Linux高性能服务器编程》读书笔记:linux服务器程序规范

发布时间 - 2025-04-19 00:00:00    点击率:

服务器程序规范需要强化和遵守的,作者列出了以下4条规范:

1、Linux服务器程序通常以守护进程(daemon)的形式在后台运行,其父进程通常是init进程(PID为1)。在7.6节“服务程序后台化”中,作者提供了一个程序清单,具有很高的参考价值。通过fork子进程并结束父进程的方式运行,可以避免因操作终端关闭而导致服务器程序终止的问题。

Linux服务器程序的用户信息容易被忽视并引发问题,涉及UID/EUID/GID/EGID等。如果应用程序需要操作某个配置文件但没有相应权限,将会导致问题。因此,确定应用程序文件的权限组和可能操作的配置文件的权限组非常重要。

EUID表示应用程序文件的所属用户ID(即文件所有者的用户ID);

EGID与EUID类似,为运行目标程序的组用户提供有效组权限;

避免使用root账户启动应用程序;

每个进程都属于一个进程组,除了PID信息外,还有进程组ID(PGID),每个进程组都有一个首领进程,其PGID和PID相同。

2、Linux服务器程序通常配备一套日志系统,至少能将日志输出到文件中,一些高级服务器还能将日志输出到专门的UDP服务器。大多数后台进程在/var/log目录下拥有自己的日志目录。

需要关注的是日志的归档。如果使用系统的调试信息输出到/var/log的方式,归档由系统自动完成。对于自定义日志路径的服务器程序,需要关注日志的归档,以避免打印几十个G的日志,导致服务器磁盘空间被占满,系统响应变慢的事故。

3、Linux服务器程序通常是可配置的,能够处理许多命令行选项。如果运行时选项过多,可以使用配置文件进行管理。大多数服务器程序都有配置文件,通常存放在/etc目录下,例如nginx的配置文件默认位于/etc/nginx/nginx.conf。

系统资源限制可以通过ulimit命令修改当前shell环境下的软限制或硬限制,这种修改对该shell启动的所有后续程序有效。也可以通过修改配置文件来永久改变系统的软限制和硬限制。例如,修改Linux操作系统对一个进程打开的文件句柄数量的限制,配置如下:

命令方式(临时):ulimit -n xx 修改每个进程可打开的文件数,默认值为1024

将修改命令写入~/.bashrc文件,或修改配置文件(永久):vi /etc/security/limits.conf

通常优化CentOS系统的网络参数如下:

终端输入vim /etc/sysctl.conf打开配置文件,将以下内容复制进文件后保存。

net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save = 1
net.core.somaxconn = 22144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
vm.overcommit_memory = 1
fs.file-max = 2000000
fs.nr_open = 2000000

优化句柄数:终端输入vim /etc/security/limits.conf打开配置文件,配置如下两项后保存。

* soft nofile 1200000
* hard nofile 1200000

4、Linux服务器进程通常在启动时生成一个PID文件并存放在/var/run目录中,用于记录该后台进程的PID。


# linux  # centos  # nginx  # 操作系统  # linux操作系统  # 服务器编程  # var  # vim  # udp  # 配置文件  # 应用程序  # 都有  # 放在  # 句柄  # 可以通过  # 能将  # 自己的  # 的是  # 出了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Java遍历集合的三种方式  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  如何选择PHP开源工具快速搭建网站?  详解MySQL数据库的安装与密码配置  Laravel如何使用Gate和Policy进行授权?(权限控制)  简单实现Android文件上传  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何用搬瓦工VPS快速搭建个人网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel集合Collection怎么用_Laravel集合常用函数详解  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  java获取注册ip实例  如何在云虚拟主机上快速搭建个人网站?  企业网站制作这些问题要关注  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  android nfc常用标签读取总结  Laravel Fortify是什么,和Jetstream有什么关系  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel如何配置和使用缓存?(Redis代码示例)  如何在阿里云ECS服务器部署织梦CMS网站?  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  IOS倒计时设置UIButton标题title的抖动问题  jquery插件bootstrapValidator表单验证详解  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Laravel如何与Pusher实现实时通信?(WebSocket示例)  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  微信小程序 wx.uploadFile无法上传解决办法  Android okhttputils现在进度显示实例代码  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何为不同团队 ID 动态生成多个“认领值班”按钮  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何使用Livewire构建动态组件?(入门代码)  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  如何安全更换建站之星模板并保留数据?  如何在建站之星绑定自定义域名?  如何在IIS管理器中快速创建并配置网站?  Python进程池调度策略_任务分发说明【指导】  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Android Socket接口实现即时通讯实例代码  奇安信“盘古石”团队突破 iOS 26.1 提权