
1. 项目概述这个考试网站部署项目是我最近完成的一个实战案例主要解决个人或小型机构快速搭建在线考试系统的需求。相比市面上动辄上万的商业考试系统这个方案最大的优势在于部署成本低、操作门槛不高但功能却相当完善。我选择用LNMPLinuxNginxMySQLPHP作为基础架构主要考虑到这套组合的成熟度和资源占用率。对于日均访问量在1000人以下的考试场景完全够用而且对服务器配置要求不高1核2G的云服务器就能流畅运行。2. 环境准备2.1 服务器选择与配置建议选择CentOS 7.x或Ubuntu 20.04 LTS作为操作系统这两个版本都有长期支持社区资源丰富。我实测在阿里云ECS t5实例1核2G上部署完全能满足50人同时在线考试的需求。关键配置点确保服务器开放80/443端口建议配置swap分区特别是小内存服务器关闭不必要的服务和端口注意生产环境务必配置防火墙规则仅开放必要端口。我曾遇到过因未配置防火墙导致服务器被挖矿程序入侵的情况。2.2 基础环境安装以CentOS 7为例基础环境安装步骤如下# 更新系统 yum update -y # 安装EPEL仓库 yum install epel-release -y # 安装常用工具 yum install -y vim wget curl git unzip3. LNMP环境部署3.1 Nginx安装与配置# 添加Nginx官方源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPM-GPG-KEY-nginx yum install nginx -y # 启动并设置开机自启 systemctl start nginx systemctl enable nginx关键配置点修改/etc/nginx/nginx.conf中的worker_processes为CPU核心数调整keepalive_timeout为65秒配置gzip压缩提升传输效率3.2 MySQL安装与优化# 添加MySQL官方源 rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm yum install mysql-community-server -y # 启动服务 systemctl start mysqld systemctl enable mysqld安装完成后需要获取临时密码grep temporary password /var/log/mysqld.log运行安全配置mysql_secure_installation创建专用数据库用户和考试系统数据库实测建议MySQL 8.0默认的内存配置较高小内存服务器需要调整/etc/my.cnf中的参数特别是innodb_buffer_pool_size。3.3 PHP环境配置# 添加Webtatic源 rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm # 安装PHP7.4及常用扩展 yum install -y php74w php74w-fpm php74w-mysqlnd php74w-gd php74w-mbstring php74w-xml关键配置修改/etc/php-fpm.d/www.conf中的用户组为nginx调整php.ini中的内存限制和上传大小memory_limit 256M upload_max_filesize 20M post_max_size 22M4. 考试系统部署4.1 代码部署与权限设置将考试系统代码上传到/var/www/exam目录后需要设置正确的权限chown -R nginx:nginx /var/www/exam find /var/www/exam -type d -exec chmod 755 {} \; find /var/www/exam -type f -exec chmod 644 {} \;4.2 Nginx虚拟主机配置创建/etc/nginx/conf.d/exam.conf配置文件server { listen 80; server_name exam.yourdomain.com; root /var/www/exam/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }配置完成后测试并重载Nginxnginx -t systemctl reload nginx4.3 数据库初始化导入考试系统的SQL文件并创建管理员账号mysql -u root -p exam_db /var/www/exam/database/exam.sql5. 安全加固5.1 基础安全措施禁用root远程登录修改SSH默认端口安装fail2ban防止暴力破解配置自动安全更新5.2 网站层面防护配置Nginx限制恶意请求设置PHP禁用危险函数定期备份数据库和代码安装安全插件监控异常行为6. 性能优化6.1 前端优化方案启用Nginx gzip压缩合并CSS/JS文件配置浏览器缓存使用CDN加速静态资源6.2 后端优化技巧配置OPcache加速PHP优化MySQL查询实现页面缓存异步处理耗时操作7. 常见问题排查7.1 502 Bad Gateway错误可能原因PHP-FPM未运行socket文件权限问题资源耗尽解决方案systemctl restart php-fpm chown -R nginx:nginx /var/run/php-fpm7.2 数据库连接失败检查要点MySQL服务状态用户权限设置防火墙规则连接字符串配置7.3 上传文件大小限制需要同时调整PHP的upload_max_filesizePHP的post_max_sizeNginx的client_max_body_size8. 扩展功能实现8.1 接入支付功能推荐使用第三方支付SDK需要注意使用官方最新版SDK配置正确的回调地址记录完整的交易日志8.2 短信通知集成常用方案对比阿里云短信API腾讯云短信服务第三方短信平台8.3 数据统计分析实现方案内置统计模块Google Analytics集成自建ELK日志分析系统在实际部署过程中我发现最大的挑战不是技术实现而是各种小细节的配置。比如有一次考试期间系统突然变慢排查后发现是MySQL的临时表空间不足。后来通过优化查询和调整tmp_table_size参数解决了问题。这也提醒我线上环境一定要提前做好压力测试。