零散的笔记容易漏步骤,这一篇把「初始化 → 装组件 → 调优 → 守护」串成一条可照抄执行的流水线。每个环节都给出可点开的细分文档。
阶段一:系统初始化
# 主机名与时区
hostnamectl set-hostname your-host
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
systemctl restart rsyslog
systemctl restart crond
数据盘挂载(云主机一般都有一块未挂载的数据盘):
fdisk -l
fdisk /dev/vdb # 依次输入 n, p, 1, w
mkfs -t ext4 /dev/vdb1
mkdir /data
mount /dev/vdb1 /data/
echo '/dev/vdb1 /data ext4 defaults 0 0' >> /etc/fstab
关闭或放行防火墙端口:
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
细分文档:挂载新数据盘、修改时区、firewalld 配置。
阶段二:安装组件
| 组件 | 推荐方式 | 文档 |
|---|---|---|
| Git | 源码编译(替换自带 1.8) | install-git |
| Node.js | 二进制包 / nvm | install-nodejs |
| Nginx | 源码编译(需自定义模块) | lnmp-source-build |
| PHP | yum(remi)或源码 | install-php |
| PHP 扩展 | pecl / 源码 | install-php-extensions |
| MySQL | yum(官方仓库) | ../database/mysql-install.md |
| Redis | 源码编译 | ../database/redis-install.md |
想省事可以用 LNMP 一键包;维护老项目参考 旧版本归档。
阶段三:Nginx 与 php-fpm 打通
server {
listen 80;
server_name www.foo.com;
root /data/wwwroot/www.foo.com;
index index.html index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 连不上时可改用 unix:/tmp/php-cgi.sock
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 12h;
}
}
php-fpm 侧要确认 listen = 127.0.0.1:9000 与上面一致,并统一运行用户:
user = www
group = www
pm = dynamic
pm.max_children = 120
验证:
nginx -t && nginx -s reload
echo '<?php phpinfo(); ?>' > /data/wwwroot/www.foo.com/test.php
curl http://127.0.0.1/test.php
阶段四:系统参数调优
文件描述符与进程限制:
echo "655350" > /proc/sys/fs/file-max
vi /etc/security/limits.conf
# 追加:
# * soft nofile 655350
# * hard nofile 655350
TCP 相关内核参数(/etc/sysctl.conf):
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 10240
ip_conntrack_max应尽量的小,以节省内核内存占用。修改后执行sysctl -p生效。
阶段五:进程守护与开机自启
自建服务用 systemd 托管;老脚本可以用 rc.local(记得 chmod +x /etc/rc.d/rc.local)。
下面是轻量级的「挂了就拉起来」监控脚本,配合 crontab 每分钟执行:
# /root/check/nginx.sh
#!/bin/sh
pgrep nginx
if [ $? -ne 0 ]; then /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf; fi
# /root/check/php.sh
#!/bin/sh
pgrep php-fpm
if [ $? -ne 0 ]; then /etc/init.d/php-fpm start; fi
# /root/check/mysql.sh
#!/bin/sh
pgrep mysql
if [ $? -ne 0 ]; then /usr/local/mysql/bin/mysqld_safe \
--datadir=/data/mydata/database \
--pid-file=/data/mydata/database/mysql.pid \
--socket=/data/mydata/database/mysql.sock; fi
# /root/check/redis.sh
#!/bin/sh
pgrep redis
if [ $? -ne 0 ]; then /usr/local/redis/etc/run.sh start; fi
chmod +x /root/check/*.sh
echo '* * * * * /root/check/nginx.sh' >> /var/spool/cron/root
验收清单
-
nginx -t通过,curl http://127.0.0.1返回首页 -
phpinfo()页面能看到已加载的redis、pdo_mysql等扩展 - MySQL 可远程连接,
my.cnf中bind-address与账号 host 已放通 - Redis 设置了
requirepass与maxmemory-policy - 80/443 已在 firewalld 放行,
firewall-cmd --list-all可见 -
ulimit -n与sysctl -p结果符合预期 - 所有服务
systemctl enable,reboot 后仍能自动拉起