在 redhat 系Linux发行版上配置Web环境,包括 CentOS, RockyLinux, AlmaLinux等;本文最早是针对CentOS 7的安装手记,后来有持续更新,也适用于较新的发行版,但脚本或配置文件里的版本号,要按实际修改。
原则上,尽量使用yum repo安装。
CentOS 官方对第三方repo的说明 https://wiki.centos.org/zh/AdditionalResources/Repositories [原地址已404,可参看 web.archive.org存档 ]
安装nginx
默认的 yum 源中也有 nginx,直接 yum install nginx 即可。但这里使用nginx 官方提供的repo,配置文件 /etc/yum.repos.d/nginx.repo 文件内容如下
[nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
以上配置文件仅为示例(2026/01/09),实际可能会有变更,以官方最新为准,具体参看 http://nginx.org/en/linux_packages.html
php(php-fpm/fastcgi版)
因为要配合nginx,所以要选择fastcgi版的php-fpm, 。这里选择remi源,这也是centos 官方推荐的php源之一。
CentOS 7 下
如下命令配置repo,将会配置好几个repo文件,但只有remi-safe.repo 是默认激活的,其他repo中的包有可能与系统文件冲突,所以在需要使用时在临时激活。
rpm -ivh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
如下命令安装php-fpm
yum --enablerepo=remi-php73 install php-fpm
remi维护了多个php版本,选用目前最新的7.3,通过–enablerepo临时激活该源。注意包名带 “-fpm” 否则是apache的模块版。注意一下安装进程,没有自动安装httpd。
按需要安装其他php扩展,下面是常用扩展的参考,
yum --enablerepo=remi-php73 install php-gd php-gmp php-igbinary \
php-mbstring php-mcrypt php-memcached php-mysqli php-odbc \
php-pdo php-xml php-zip php-zlib php-bcmath php-imagick
CentOS 8 及以后版本
从Redhat EL8起,新版本的dnf/yum 有了模块的概念,remi源的php-fpm 也改由模块管理,先设定版本号,再install 安装即可,不用每次 –enable-repo…
dnf module switch-to php:remi-8.4 dnf module install php:remi-8.4 # 这里写的确实是 php,但实际上匹配并安装的还是 php-fpm 包 yum install php-mysqli ... # 安装必要的扩展
php-fpm的配置文件
配置php-fpm。主要是文件 /etc/php-fpm.d/www.conf ,默认fastcgi进程数是动态管理的,根据机器内存、负载等控制进程数,下面是微小站点的配置,其中user/group 不用改、保持默认的apache也行;除非从旧站迁移来的web目录的文件由 nobody 用户所有。(或许默认的apache与后面提到的session文件目录默认权限是相符的,待确定 TODO )
user = nobody group = nobody listen = 127.0.0.1:9000 pm = dynamic pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 5
如果上面使用 nobody 用户,要同步修改php默认的session文件存储目录权限,按前面php-fpm用户设置为
chown nobody:nobody /var/lib/php/session
在nginx启用php
nginx主配置文件为 /etc/nginx/nginx.conf,站点配置文件在 /etc/nginx/conf.d/*.conf ,默认参看主配置文件结尾处 include /etc/nginx/conf.d/*.conf 一行。
推荐习惯:把web站点文件放在 /var/www/html/ 目录下,每个站点一个子目录,下面以默认站点文件的配置为例,其他站点参考即可。更多参考nignx官方文档,尤其是其中core模块 ngx_http_core_module
为默认站点 default.conf 创建目录 mkdir -p /var/www/html/default ,备份一下自带的的站点文件 cp /etc/nginx/conf.d/default.conf{,__original} ,参考下面示例修改 /etc/nginx/conf.d/default.conf 文件。有更多站点,用default.conf 作模板修改。选项说明:
- 其中 listen 80 default; 一行表示这是默认站点,其他站点就不能加了。
- 特别注意,下面的配置示例,对原版配置中的指令 root 做了修改:
- 原配置文件在location / {…} 与 location ~ \.php$ {…} 各有一条 root 指令,不太适合常规 php 站点,改进一下,以便简洁易维护。
- 这两行 root 指令都注释掉,而是把 root 指令放到上一层,即直接放到 server{…}节点中。
- php 配置fastcgi_param 指令中使用$document_root 变量,(原版配置文件里使用的是直接指定绝对路径)。
- try_files $uri $uri/ /index.php; 一行是WordPress的伪静态rewrite规则;
- rewrite ^/feed /license.txt; 是把url重写到指定文件上
- 如果配置ssl/https,可以使用Let’s Encrypt免费证书,步骤及设置参数可参看这里
server {
listen 80 default;
server_name blog.path8.net;
#server_name blog.path8.net www.path8.net; #多域名
root /var/www/html/default;
#autoindex on;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location /favicon.ico {
log_not_found off;
access_log off;
}
location /robots.txt {
log_not_found off;
access_log off;
}
location / {
# root /usr/share/nginx/html;
index index.html index.htm;
#try_files $uri $uri/ /index.php;
#rewrite ^/feed /license.txt;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
修改完成后,nginx -t 测试配置文件,无误后启动(start)nginx及php-fpm,并设置自动启动(enable)
nginx -t systemctl start nginx systemctl status nginx systemctl enable nginx systemctl start php-fpm systemctl status php-fpm systemctl enable php-fpm
常见错误
如果静态文件正常,php请求报错 File not found ,并且nginx error日志中有如下错误 FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream 可去检查: 1) web文件权限与php-fpm用户是否匹配,2)尤其是,location ~ \.php$ {…} 里面使用$document_root变量的话,外层是不是有 root 指令指定web目录,在 location / {…} 里面指定 root 指定的目录,是无效的;3)还有是不是开着SELinux且没配置好规则。
数据库MySQL/MariaDB安装
遵循CentOS7的改变,使用Mariadb替换MySQL,使用上差别不大,基本上完全沿用MySQL,除了改个名字。yum安装服务端及客户端
yum install mariadb mariadb-server
先不急着启动服务,修改一下配置文件,参考下面,放到[mysqld]节点后,大概第10行。这是适合微小型服务器的配置参数,可以按实际调整。的话添加下面几行。
#add by fengyqf start 161105 skip-name-resolve innodb_log_buffer_size=32M innodb_buffer_pool_size=64M innodb_log_file_size=16M #innodb_additional_mem_pool_size=16M # removed in MySQL 5.7 server-id=301 log-bin=mysql-bin log-error=mysql-bin.err expire_logs_days=30 open_files_limit=10240 #add by fengyqf end
其中server-id起的4行,是配置复制功能用的,不要MySQL复制功能的话可以删除,带上就会生成一系列二进制文件,多占用磁盘。(开启MySQL复制的设置。)
systemctl start mariadb systemctl status mariadb systemctl enable mariad
如果在修改配置前启动过服务,可能因为二进制日志不兼容而启动失败,删除日志文件再启动即可 rm /var/lib/mysql/ib_logfile*
上传文件大小限制
默认情况下,php与nginx都对web上传文件有限制
php的限制,有两个参数(参看官方手册)
post_max_size = 20M upload_max_filesize = 20M
nginx的限制,使用上很灵活,可以在nginx全局、单独站点、指定目录等层次上做设置(参看nginx 文档 – client_max_body_size参数)
client_max_body_size 20m
Eof
Last Updated on 2026/01/09
一直用的这个数据库,非常的不错,感觉和mysql米什么区别,这么多年。