引言

PHP是一种广泛使用的开源脚本语言,特别适合Web开发。在Oracle Linux 8.3系统上安装PHP可以为您的Web应用程序提供稳定高效的运行环境。本指南将详细介绍从基础配置到环境测试的完整过程,帮助您轻松搭建PHP运行环境。

系统准备

在开始安装PHP之前,我们需要确保系统是最新的并配置好必要的软件仓库。

更新系统

首先,让我们更新系统到最新状态:

sudo dnf update -y 

添加EPEL和REMI仓库

EPEL(Extra Packages for Enterprise Linux)和REMI仓库提供了许多额外的软件包,包括各种版本的PHP。

# 安装EPEL仓库 sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm # 安装REMI仓库 sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm 

启用PowerTools仓库

某些PHP依赖可能需要PowerTools仓库:

sudo dnf config-manager --set-enabled powertools 

安装PHP

Oracle Linux 8.3默认提供PHP 7.2版本,但通过REMI仓库,我们可以安装更新的PHP版本,如PHP 7.4、PHP 8.0或PHP 8.1。

查看可用的PHP版本

sudo dnf module list php 

启用所需的PHP版本

例如,要安装PHP 8.1:

sudo dnf module enable php:remi-8.1 -y 

安装PHP及其常用扩展

sudo dnf install -y php php-common php-opcache php-cli php-fpm php-mysqlnd php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-json 

验证PHP安装

安装完成后,验证PHP是否正确安装:

php -v 

您应该看到类似以下的输出:

PHP 8.1.10 (cli) (built: Aug 25 2022 14:10:30) (NTS gcc x86_64) Copyright (c) The PHP Group Zend Engine v4.1.10, Copyright (c) Zend Technologies with Zend OPcache v8.1.10, Copyright (c), by Zend Technologies 

配置PHP

PHP安装完成后,我们需要进行一些基本配置以确保其安全高效运行。

PHP配置文件位置

PHP的主要配置文件位于:

  • CLI环境:/etc/php.ini
  • FPM环境:/etc/php-fpm.ini/etc/php-fpm.d/www.conf

基本PHP配置

编辑PHP配置文件:

sudo vi /etc/php.ini 

以下是一些推荐的配置项:

; 设置时区 date.timezone = Asia/Shanghai ; 增加上传文件大小限制 upload_max_filesize = 64M post_max_size = 64M ; 提高内存限制 memory_limit = 256M ; 设置最大执行时间 max_execution_time = 300 ; 显示错误(开发环境) display_errors = On display_startup_errors = On ; 记录错误(生产环境) log_errors = On error_log = /var/log/php/error.log ; 禁用危险函数(生产环境) disable_functions = exec,passthru,shell_exec,system,proc_open,popen 

创建PHP错误日志目录

sudo mkdir -p /var/log/php sudo touch /var/log/php/error.log sudo chown -R apache:apache /var/log/php 

配置PHP-FPM

PHP-FPM(FastCGI Process Manager)是PHP的FastCGI实现,常用于高负载网站。

编辑PHP-FPM配置文件:

sudo vi /etc/php-fpm.d/www.conf 

以下是一些推荐的配置项:

; 设置用户和组 user = apache group = apache ; 设置监听方式 listen = /run/php-fpm/www.sock listen.owner = apache listen.group = apache listen.mode = 0660 ; 设置进程管理器 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 ; 设置请求超时时间 request_terminate_timeout = 300 ; 设置慢日志 slowlog = /var/log/php-fpm/www-slow.log request_slowlog_timeout = 10s 

启动并启用PHP-FPM服务

sudo systemctl start php-fpm sudo systemctl enable php-fpm 

检查PHP-FPM状态:

sudo systemctl status php-fpm 

安装额外的PHP扩展

根据您的应用程序需求,可能需要安装额外的PHP扩展。

查看可用的PHP扩展

sudo dnf search php- 

安装常用扩展

# 安装Redis扩展 sudo dnf install -y php-pecl-redis5 # 安装Memcached扩展 sudo dnf install -y php-pecl-memcached # 安装Imagick扩展 sudo dnf install -y php-pecl-imagick # 安装Xdebug扩展(开发环境) sudo dnf install -y php-pecl-xdebug 

安装PECL扩展

某些扩展可能需要通过PECL安装:

# 安装开发工具 sudo dnf install -y php-devel php-pear make gcc # 安装扩展示例(如swoole) sudo pecl install swoole 

创建扩展配置文件:

echo "extension=swoole.so" | sudo tee /etc/php.d/40-swoole.ini 

重启PHP-FPM以加载新扩展:

sudo systemctl restart php-fpm 

配置Web服务器

PHP可以与Apache或Nginx等Web服务器配合使用。以下是两种Web服务器的配置方法。

配置Apache服务器

安装Apache

sudo dnf install -y httpd sudo systemctl start httpd sudo systemctl enable httpd 

配置Apache支持PHP

创建Apache配置文件:

sudo vi /etc/httpd/conf.d/php.conf 

添加以下内容:

<FilesMatch .php$> SetHandler "proxy:fcgi://run/php-fpm/www.sock" </FilesMatch> AddType text/html .php DirectoryIndex index.php 

创建虚拟主机

创建网站目录和测试文件:

sudo mkdir -p /var/www/example.com sudo chown -R apache:apache /var/www/example.com sudo chmod -R 755 /var/www/example.com 

创建虚拟主机配置文件:

sudo vi /etc/httpd/conf.d/example.com.conf 

添加以下内容:

<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/example.com <Directory /var/www/example.com> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog /var/log/httpd/example.com-error.log CustomLog /var/log/httpd/example.com-access.log combined </VirtualHost> 

重启Apache服务:

sudo systemctl restart httpd 

配置Nginx服务器

安装Nginx

sudo dnf install -y nginx sudo systemctl start nginx sudo systemctl enable nginx 

配置Nginx支持PHP

创建Nginx配置文件:

sudo vi /etc/nginx/conf.d/php.conf 

添加以下内容:

upstream php-fpm { server unix:/run/php-fpm/www.sock; } 

创建虚拟主机

创建网站目录和测试文件:

sudo mkdir -p /var/www/example.com sudo chown -R nginx:nginx /var/www/example.com sudo chmod -R 755 /var/www/example.com 

创建虚拟主机配置文件:

sudo vi /etc/nginx/conf.d/example.com.conf 

添加以下内容:

server { listen 80; server_name example.com; root /var/www/example.com; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { fastcgi_pass php-fpm; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /.ht { deny all; } error_log /var/log/nginx/example.com-error.log; access_log /var/log/nginx/example.com-access.log; } 

重启Nginx服务:

sudo systemctl restart nginx 

测试PHP环境

创建PHP信息页面

创建一个PHP信息页面以测试PHP是否正常工作:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.com/info.php 

访问测试页面

在浏览器中访问 http://example.com/info.php,您应该看到PHP的详细信息页面,包括已安装的扩展和配置设置。

创建数据库连接测试

如果您已安装MySQL或MariaDB,可以创建一个数据库连接测试页面:

cat << 'EOF' | sudo tee /var/www/example.com/db-test.php <?php $host = 'localhost'; $dbname = 'test'; $username = 'testuser'; $password = 'password'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); echo "Connected to $dbname at $host successfully."; } catch (PDOException $e) { die("Could not connect to the database $dbname :" . $e->getMessage()); } ?> EOF 

性能测试

创建一个简单的性能测试页面:

cat << 'EOF' | sudo tee /var/www/example.com/performance-test.php <?php $start = microtime(true); // 执行一些计算密集型任务 for ($i = 0; $i < 1000000; $i++) { $array[] = $i * $i; } // 执行一些字符串操作 $string = ""; for ($i = 0; $i < 10000; $i++) { $string .= md5($i); } $end = microtime(true); $execution_time = ($end - $start); echo "Execution time: " . $execution_time . " seconds"; echo "<br>Memory used: " . round(memory_get_usage() / 1024 / 1024, 2) . " MB"; ?> EOF 

故障排除

PHP-FPM常见问题

PHP-FPM服务无法启动

检查PHP-FPM配置文件语法:

sudo php-fpm -t 

查看错误日志:

sudo tail -f /var/log/php-fpm/error.log 

502 Bad Gateway错误

这通常表示Nginx无法连接到PHP-FPM。检查以下几点:

  1. 确保PHP-FPM服务正在运行:
sudo systemctl status php-fpm 
  1. 检查PHP-FPM套接字文件权限:
ls -la /run/php-fpm/www.sock 
  1. 检查Nginx配置中的PHP-FPM upstream设置:
upstream php-fpm { server unix:/run/php-fpm/www.sock; } 

PHP扩展问题

扩展未加载

  1. 检查扩展是否已安装:
php -m | grep extension_name 
  1. 检查扩展配置文件:
ls /etc/php.d/ | grep extension_name 
  1. 确保扩展配置文件包含以下内容:
extension=extension_name.so 

扩展编译错误

如果通过PECL安装扩展时遇到编译错误,可能需要安装必要的开发包:

sudo dnf install -y php-devel gcc make autoconf 

权限问题

确保Web服务器用户(Apache为apache,Nginx为nginx)对网站目录有适当的权限:

sudo chown -R apache:apache /var/www/example.com # 对于Apache sudo chown -R nginx:nginx /var/www/example.com # 对于Nginx sudo chmod -R 755 /var/www/example.com 

SELinux问题

如果启用了SELinux,可能会遇到权限问题。检查SELinux状态:

sestatus 

临时禁用SELinux进行测试:

sudo setenforce 0 

如果禁用SELinux后问题解决,可以配置适当的SELinux策略:

# 允许Web服务器连接到网络 sudo setsebool -P httpd_can_network_connect 1 # 允许Web服务器发送邮件 sudo setsebool -P httpd_can_sendmail 1 # 允许PHP-FPM写入特定目录 sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/example.com(/.*)?" sudo restorecon -Rv /var/www/example.com 

安全加固

PHP安全配置

编辑PHP配置文件,添加以下安全设置:

sudo vi /etc/php.ini 
; 隐藏PHP版本信息 expose_php = Off ; 禁用危险函数 disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source ; 启用SQL安全模式 sql.safe_mode = On ; 限制文件访问 open_basedir = /var/www/example.com/:/tmp/ ; 禁用远程文件包含 allow_url_fopen = Off allow_url_include = Off ; 启用会话安全 session.cookie_httponly = 1 session.use_only_cookies = 1 session.cookie_secure = 1 session.cookie_samesite = Strict 

Web服务器安全配置

Apache安全配置

编辑Apache配置文件:

sudo vi /etc/httpd/conf/httpd.conf 

添加或修改以下设置:

# 隐藏服务器版本信息 ServerTokens Prod ServerSignature Off # 禁用目录列表 Options -Indexes # 防止点击劫持 Header always append X-Frame-Options SAMEORIGIN # 启用XSS保护 Header set X-XSS-Protection "1; mode=block" # 防止MIME类型嗅探 Header set X-Content-Type-Options "nosniff" # 启用HSTS Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" 

Nginx安全配置

编辑Nginx配置文件:

sudo vi /etc/nginx/nginx.conf 

添加或修改以下设置:

# 隐藏Nginx版本信息 server_tokens off; # 防止点击劫持 add_header X-Frame-Options "SAMEORIGIN" always; # 启用XSS保护 add_header X-XSS-Protection "1; mode=block" always; # 防止MIME类型嗅探 add_header X-Content-Type-Options "nosniff" always; # 启用HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 

防火墙配置

配置防火墙以只允许必要的端口:

# 安装firewalld sudo dnf install -y firewalld sudo systemctl start firewalld sudo systemctl enable firewalld # 允许HTTP和HTTPS流量 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # 如果需要SSH访问 sudo firewall-cmd --permanent --add-service=ssh # 重新加载防火墙配置 sudo firewall-cmd --reload 

性能优化

PHP性能优化

OPcache配置

编辑PHP配置文件:

sudo vi /etc/php.d/10-opcache.ini 

添加或修改以下设置:

opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 opcache.validate_timestamps=0 # 生产环境设置为0 

PHP-FPM优化

编辑PHP-FPM配置文件:

sudo vi /etc/php-fpm.d/www.conf 

根据服务器资源调整以下设置:

; 进程管理器设置 pm = dynamic pm.max_children = 100 # 根据可用内存调整 pm.start_servers = 20 pm.min_spare_servers = 10 pm.max_spare_servers = 30 pm.max_requests = 1000 ; 请求超时设置 request_terminate_timeout = 30 

Web服务器性能优化

Apache优化

编辑Apache配置文件:

sudo vi /etc/httpd/conf/httpd.conf 

添加或修改以下设置:

# 启用KeepAlive KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 # 调整MPM设置 <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule> # 启用缓存模块 LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so <IfModule mod_cache_disk.c> CacheEnable disk / CacheRoot /var/cache/httpd CacheDirLength 2 CacheDirLevels 2 CacheDefaultExpire 3600 CacheMaxFileSize 1000000 CacheMinFileSize 1 </IfModule> 

Nginx优化

编辑Nginx配置文件:

sudo vi /etc/nginx/nginx.conf 

添加或修改以下设置:

# 工作进程数(通常设置为CPU核心数) worker_processes auto; # 每个工作进程的最大连接数 events { worker_connections 1024; } # 启用Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 缓存设置 http { open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; } 

系统级优化

内核参数优化

编辑系统配置文件:

sudo vi /etc/sysctl.conf 

添加以下设置:

# 增加文件描述符限制 fs.file-max = 100000 # 网络设置 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 = 30 net.ipv4.tcp_keepalive_time = 120 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.ip_local_port_range = 1024 65000 

应用新的内核参数:

sudo sysctl -p 

增加文件描述符限制

编辑limits配置文件:

sudo vi /etc/security/limits.conf 

添加以下设置:

* soft nofile 65536 * hard nofile 65536 

监控和维护

PHP-FPM状态监控

启用PHP-FPM状态页面:

sudo vi /etc/php-fpm.d/www.conf 

取消注释并修改以下行:

pm.status_path = /status ping.path = /ping 

配置Web服务器以访问状态页面:

对于Apache:

<LocationMatch "/status"> Require ip 127.0.0.1 SetHandler "proxy:fcgi://run/php-fpm/www.sock" </LocationMatch> 

对于Nginx:

location ~ ^/(status|ping)$ { allow 127.0.0.1; deny all; fastcgi_pass php-fpm; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 

日志监控

配置日志轮转:

sudo vi /etc/logrotate.d/php-fpm 

添加以下内容:

/var/log/php-fpm/*log { daily missingok rotate 52 compress delaycompress notifempty sharedscripts postrotate /bin/kill -SIGUSR1 `cat /run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true endscript } 

性能监控工具

安装和使用监控工具:

# 安装htop sudo dnf install -y htop # 安装vmstat sudo dnf install -y procps-ng # 安装iotop(监控I/O) sudo dnf install -y iotop # 安装net-tools(网络监控) sudo dnf install -y net-tools 

总结

本指南详细介绍了在Oracle Linux 8.3系统上安装和配置PHP的完整过程。我们从系统准备开始,逐步介绍了PHP的安装、配置、扩展安装、Web服务器配置、环境测试、故障排除、安全加固和性能优化等方面。

通过遵循本指南,您应该能够成功搭建一个稳定、安全、高效的PHP运行环境。根据您的具体需求,您可能需要进一步调整配置参数和安装额外的PHP扩展。

记住,维护一个PHP运行环境是一个持续的过程,需要定期更新软件包、监控系统性能并及时解决出现的问题。希望本指南能够帮助您顺利完成PHP环境的搭建,并为您的Web应用程序提供可靠的运行平台。