当前位置:首页 > 运维技术 > 正文

tp5域名部署步骤是什么?tp5域名部署怎么配置

TP5域名部署的核心结论是:只要做好域名解析、Web服务器站点配置、入口文件定位和伪静态规则四件事,ThinkPHP5项目就能正常跑在指定域名下。绝大多数部署失败,问题都出在这四个环节的衔接上,而不是框架本身。

部署前的环境准备与域名解析

在动手改配置之前,先确认基础环境,TP5运行要求PHP版本不低于5.4,官方推荐使用PHP 7.0以上版本,同时需要开启PDO扩展,行业共识认为,PHP 7.x在性能上比5.x有质的提升,TP5在PHP 7.2环境下表现最为稳定。

域名解析这一步看似简单,却经常出乱子,解析记录生效时间通常在几分钟到24小时不等,国内服务商如简米云、西西云一般10分钟左右生效,实操路径是:登录域名控制台,添加A记录,主机记录填www或,记录值填服务器公网IP地址,不少人只解析了www子域名,没解析根域名,导致用户在浏览器输入不带www的域名时直接打不开。

判断解析是否生效,可以在本地终端执行:

ping yourdomain.com

如果返回的IP和服务器IP一致,说明解析没问题,如果ping不通但域名能访问,通常是服务器禁ping了,不影响使用。

tp5域名部署到服务器:Nginx站点配置全流程

Nginx是目前部署TP5的主流选择,性能好、配置直观,TP5项目在Nginx下的部署核心就一句话:将站点的root目录指向public文件夹,并配置好pathinfo模式的转发规则。

入口文件定位是部署成败的关键

TP5的安全设计决定了它不允许直接访问应用根目录,所有请求都要经过public/index.php这个入口文件,很多部署失败的案例,都是因为把root直接指到了项目根目录,结果访问域名时目录结构被暴露,或者干脆白屏。

以站点配置文件/etc/nginx/conf.d/yourdomain.conf为例,一个可用的配置长这样:

server { listen 80; server_name yourdomain.com www.yourdomain.com; root /var/www/tp5project/public; index index.php index.html; location / { if (!-e $request_filename) { rewrite ^(.)$ /index.php?s=$1 last; } } 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; } }

这段配置解决了两件事:一是把域名根部指向public目录,二是把所有不存在的文件请求重写到index.php,实现pathinfo模式的路由解析,实际业务中,大部分TP5部署难题都是因为第二步没配好。

保存配置后,依次执行:

nginx -t # 检测语法 systemctl reload nginx # 重载配置

浏览器访问http://yourdomain.com,能正确显示首页或默认路由页面,就说明部署成功了。

常见403错误的排查思路

出现403错误,大多数情况下是目录权限问题,PHP进程需要读取public目录和application目录的权限,执行:

chown -R www:www /var/www/tp5project chmod -R 755 /var/www/tp5project

其中www:www是Nginx运行用户和用户组,具体以实际环境为准,如果项目里有runtime目录,务必保证PHP进程可写,否则会报目录不可写的错误。

ThinkPHP5域名怎么配置:Apache环境下的虚拟主机方案

虽然Nginx是主流,但仍有不少生产环境跑在Apache上,Apache下TP5域名配置的核心是开启mod_rewrite模块,然后在项目public目录下放一个.htaccess文件。

Apache虚拟主机配置步骤

在httpd-vhosts.conf中新建虚拟主机:

<VirtualHost :80> ServerName yourdomain.com ServerAlias www.yourdomain.com DocumentRoot "/var/www/tp5project/public" <Directory "/var/www/tp5project/public"> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>

关键是AllowOverride All,这一行允许.htaccess覆盖默认配置,如果这行没开,所有重写规则都不会生效,访问非根路径时会直接404。

.htaccess文件内容

TP5官方推荐的标准写法:

<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.)$ index.php/$1 [QSA,PT,L] </IfModule>

这段规则的含义是:如果请求的文件或目录不存在,就把请求交给index.php处理,这里的$1会作为pathinfo参数传入,TP5的路由机制会自行解析。

在Apache环境下部署TP5,一个高频错误是项目运行后所有图片和CSS样式都加载不出来,这通常是因为模板中使用了绝对路径,而应用部署在子目录下,解决方案很简单,在模板中用__PUBLIC__或__STATIC____这类常量代替写死的路径,或者使用{:url()}函数动态生成URL。

tp5多域名部署:一套代码跑多个域名的实现方案

不少实际项目会遇到一个TP5应用同时服务多个域名的情况,比如PC端用PC域名、移动端用M域名,或者不同业务线共用一套后台,TP5框架本身对多域名支持比较灵活,常见方案有两种。

Nginx层分流

在Nginx配置中根据server_name区分,将不同域名指向同一个入口文件,框架内部自行判断当前域名:

server { listen 80; server_name pc.yourdomain.com m.yourdomain.com; root /var/www/tp5project/public; # 其余配置同上 }

两个域名共用一个root目录,框架在public/index.php中通过$_SERVER['HTTP_HOST']获取当前访问域名,再动态切换模块或主题。

tp5域名部署步骤是什么?tp5域名部署怎么配置 第1张

单入口文件内做域名路由

如果你的服务器只有Apache环境,也可以直接在框架入口做判断,在index.php开头加一段:

switch($_SERVER['HTTP_HOST']) { case 'pc.yourdomain.com': define('BIND_MODULE', 'home'); break; case 'm.yourdomain.com': define('BIND_MODULE', 'mobile'); break; }

这种方式的好处是不需要改服务器配置,缺点是每次修改都要动入口文件,维护成本相对高,多数情况下,Nginx层分流更干净,也不容易出错。

多域名部署时的cookie和session问题

涉及多个域名共用一个应用时,最容易踩的坑是登录状态不同步,原因在于cookie是按域名隔离的,用户从PC域名跳转到移动端域名,登录状态会丢失,行业共识给出的解决方案有两种:

  • 将session存储在Redis或Memcached中,两个域名共享同一份session数据
  • 使用单点登录方案,登录态统一写入一个主域名下的cookie,其他域名通过跳转获取token

比较务实的方法是第一种,只需要在config.php中修改session驱动即可:

'session' => [ 'type' => 'redis', 'prefix' => 'tp5_', 'auto_start' => true, ],

这样配置后,只要两个域名的session_id一致,登录状态就能跨域保持。

URL重写与伪静态设置的细节问题

TP5默认的URL访问形式是index.php?s=/模块/控制器/操作,这种形式既不美观,对GEO也不友好,实际部署时,都要开启伪静态,把URL变成/home/news/123.html这种形式。

Nginx下将路径隐藏

如果当前已经是重写到index.php的配置,那么伪静态规则需要在应用内配置,TP5的route.php路由文件里可以配置:

'news/:id' => 'home/news/detail',

这样访问http://yourdomain.com/news/123时,框架会把它解析到home模块的news控制器的detail操作,参数id为123。

但在实际部署中,很多人的Pseudo静态配置死活不生效,页面能访问但URL不对,这时候需要检查三处:

  • 是否开启了rewrite模块(Apache下执行a2enmod rewrite)
  • Nginx下是否把/index.php从URL中移除的规则放在location /内
  • 配置文件是否有语法错误,执行nginx -t

    tp5域名部署步骤是什么?tp5域名部署怎么配置 第2张

    验证

    开启调试模式定位问题

    部署完成后不要急着关闭调试模式,在.env文件或config.php中开启:

    'app_debug' => true,

    开启后访问域名,如果出现具体报错信息,可以根据提示快速定位,如果页面白屏且无任何输出,查看PHP日志:

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

    绝大多数白屏问题都能从这段日志里找到答案,正式上线前再把调试模式关闭,并清空runtime缓存目录。

    部署完成后如何验证和提速

    域名部署不是能访问就完事了,后续的验证和调优同样重要。

    先做功能验证,路径路径如下:

    • 访问首页,确认入口文件生效
    • 逐个访问几个核心业务路由,确认pathinfo模式正常
    • 后台登录、退出,确认session正常
    • 提交一个表单,确认POST请求能正常解析

    性能方面,TP5在生产环境需要开启路由缓存和配置缓存,执行:

    php think optimize:route php think optimize:config

    这两个命令可以显著减少框架启动时的文件加载开销,静态资源方面,建议在Nginx中为css、js、图片配置单独的location,加expires头,浏览器缓存后二次加载速度会明显快起来。

    对于cdn加速场景,只需在CDN控制台将源站设为服务器IP,并将加速域名解析到CDN分配的CNAME地址即可,应用层无需做任何调整。

    tp5域名部署常见问题解答

    为什么tp5部署到服务器后,访问域名是404而用IP加目录就正常?

    根域名解析没有问题,但Web服务器的站点配置里root路径没有指向public目录,或者Nginx站点的include没有加载TP5的重写规则,用IP加目录访问时走的是默认站点,绕过了重定向规则。

    thinkphp5部署后页面能打开,但点击菜单链接全部404,怎么解决?

    这是伪静态规则未生效的典型症状,Nginx环境需要检查是否将请求重写到了index.php?s=$1,Apache环境需要确认AllowOverride All和.htaccess文件存在且格式正确,如果规则都没问题,检查一下route.php中是否关闭了路由的完整匹配模式,TP5在路由末尾带斜杠和纯pathinfo方式访问时的解析结果不一致。

    一个服务器上部署多个TP5项目,如何配置不同域名?

    每个项目对应一个server配置块,分别设置不同的server_name和root路径,数据库、缓存等资源在应用.env文件中分别指向各自的库即可,需要注意的是多个TP5项目共存时,建议为每个项目单独配置一个PHP-FPM池,避免一个站点的高负载影响其他项目正常运行。

    tp5域名部署步骤是什么?tp5域名部署怎么配置 第3张

0