当前位置:首页 > 网络教程 > php > Windows Server下基于IIS使用wordpress建网站

Windows Server下基于IIS使用wordpress建网站

一叶知秋2023-11-15 11:03:40php10


前言

之前学习wordpress时,因为对Linux不熟悉,所以原计划是基于windows server + IIS,但是中途遇到一个500错误,看了很多资料都没能解决,所以最终还是用了Linux. 之后对整个体系有了一些了解,重拾原计划,又遇到一些新问题,折腾一番后,有了许多新的认识。
记录备忘。


一、WordPress构建网站所需要的组件

在基于Linux的笔记中,总结了6项。
https://blog.csdn.net/m0_54284125/article/details/134346019
仔细想下,其实合并成5项比较贴切:

  1. 服务器操作系统
    这个是基础,所有的软件必须运行在操作系统之。

  2. Web服务器软件
    最常见的是IIS, Apach, Nginx. IIS主要配套用于Windows Server。

  3. php 程序
    不解释, php都不理解,折腾啥网站嘛。

以上3样是最根本的,有这些,就可以做网站了。WordPress只是一个便利化工具而已

  1. 数据库软件
    只所以要数据库软件,是因为用wordpress开发网站,网页里的文字内容(包括配置内容)其实是存在数据库里的,不是放在服务器文件目录中的。
    选择很多,不过最常用的还是Mysql 和 Mariadb, 开源嘛。
    数据库管理软件可装可不装,实际上不怎么用得到,我只是用它来探究过wordpress的信息架构。网上各种教程里提到的最多的是phpMyAdmin, 好处是网页版,简单易懂,坏处是必须装在server上。用其它常规的数据库管理软件也行,比如宇宙第一的DBeaver。
  2. wordpress 本身

二、组件安装与配置

总的感觉是, 在Windows Server + IIS 上配置wordpress 比在Linux + Apach上要复杂得多。
先列出总结的最关键的雷区:

  1. IIS安装时一定要勾选CGI选项
  2. 各个组件的版本要慎重选择,尤其是php的版本。
    建议安装之前到WordPress官网看一下兼容性要求:
    WordPress Compatibility
    我就遇到了安装php8.2, 测试php时通不过,换到8.0才解决。
  3. IIS里一定要配置“模块映射”,将*.php 映射到 CgiModule (可执行文件php-cgi.exe)上
  4. IIS里一定要设置“默认文档"为index.php
    否则在输入类似 http://host/wp-admin/ 时,会提示403错误。有可能会提示你启动”目录浏览“功能,这不是想要的。
  5. 安装好数据库软件,为wordpress创建database和user后,一定要记得给这个user设置这个database的权限
    否则就会遇到500错误,当初我就是卡在这里没能解决。
  6. wordpress解压到web根目录后(假定常规安装法), 一定要设置web目录权限
    Windows Server + IIS,默认的web根目录是c:\interpub\wwwroot
    如果没设置权限,很可能会出现主题无法安装及无法上传媒体文件的问题。
  7. 设置临时文件目录
    上传media文件时需要用到临时目录,Windows上默认是C:\Windows\Temp, 不推荐用这个。
    最好是在php.ini里指定一个给wordpress专用的,类似upload_tmp_dir = C:/inetpub/wwwroot/wp-content/temp。 如果想用系统默认的临时目录,要给用户ISUR加上写权限。

1.启用IIS

我用的是腾讯云轻量应用服务器,Windows Serve版本是 2012 R2 Datacentere,其它版本界面可能会不一样,但方法大同小异。
“控制面板” --> “程序和功能” --> “启用或关闭Windows功能”
会启动“服务器管理器”的"添加角色和功能向导”。
选择 “Web服务器(IIS)”, 最重要的是一定要勾选"应用程序开发"下的CGI
在这里插入图片描述
安装结束后,可以测试是否成功,方法是在在客户端面浏览器上输入http://ip (或domain)/
或者在server的浏览器里输入http://localhost/
如果能看到下面的页面,说明IIS能正常工作了。
背后的原理很简单,在IIS web根目录(如果没做特殊设置的话是C:\inetpub\wwwroot)下有一个iisstart.htm文件。这个页面显示的是这个文件的内容
在这里插入图片描述

成功后,可以启动IIS管理器看看。发现它的版本是6.2, 比较老了。

接下来进一步设置wwwroot文件夹的访问权限。
在c:\inetpub\wwwroot目录上点右键,选择"安全" ,为Users和IIS_IUSRS增加"修改"权限。IUSE、IIS_IUSRS组是IIS的内置用户名和用户组,可以参考微软官方文档:
IIS 7.0 及更高版本的默认权限和用户权限
大体上相当于Apach的apach:apach用户组和用户名
在这里插入图片描述

2.安装及配置php

  1. 下载
    php下载地址: https://windows.php.net/download
    注意要下载non-thread-safe 的版本, 64bit (32bit操作系统已经不常见了)
    更要注意下载的版本,要确保跟wordpress版本兼容。

  2. 安装
    php是免安装的,所谓的安装就是解压缩而已。将下载的php文件解压,比如c:\php

  3. 下载安装Visual C++ Redistributable(C++ 应用程序运行时组件包)
    下载php时会注意到,官网上说"More recent versions of PHP are built with VC15 or VS16 (Visual Studio 2017 or 2019 compiler respectively) and include improvements in performance and stability. The VC15 and VS16 builds require to have the Visual C++ Redistributable for Visual Studio 2015-2019 x64 or x86 installed"。所以需要下载安装Visual C++ Redistributable for Visual Studio 2015-2019 x64 or x86, 官网上有下载链接

  4. 配置php.ini
    将php文件夹根目录里的php.ini-development或者php.ini-production改名为php.ini
    然后打开php.ini, 修改以下选项。这些选项原文件里前面有; 注释掉,去掉该分号,如果是设置目录路径的,根据你php实际路径设置。前5个是关键后,后面那些扩展看情况启用。

extension_dir = "ext"
cgi.force_redirect = 0 
cgi.fix_pathinfo = 1
fastcgi_impersonate = 1
upload_tmp_dir = C:/inetpub/wwwroot/wp-content/temp
date.timezone = RPC
extension=curl
extension=gd2
extension=gmp
extension=imap
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql
extension=soap
extension=sockets
  1. 配置"模块映射"
    在这里插入图片描述
    在这里插入图片描述

  2. 配置"默认文档"
    这是为wordpress做准备,因为wordpress用的是php, 而且default页面是index.php, 加了index.php以后,可以把其它的删掉。
    在这里插入图片描述
    在这里插入图片描述

  3. 配置php.ini更新监测
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. 配置环境变量
    在系统环境变量PATH中把php的路径加上去

  5. 验证php配置是否成功
    创建一个php文件,比如说info.php ,放入以下代码。

<?php
    phpinfo();
?> 

保存后,在浏览器上打开这个文件
http://localhost/info.php
如果看到类似以下页面,说明php安装成功,运行正常.
在这里插入图片描述

IIS + php 学习实践过程中参考了以下文章,感谢他们的分享!
windows IIS安装php服务及配置
Windows Server上安装部署WordPress

3. 安装、配置MySQL

在CentOS上实践时我用的是MariaDB, 结果在windows上到官网上找了半天也没发现下载的链接,所以就到Oracle官网下了MySQL 5.7, 下载后才发现这个是要手工安装的。
有些麻烦,好在找到了一篇靠谱的文章:
Window 安装 MySQL 5.7.31 免安装版

总结以下要点:

  1. 在mysql的根目录下自行创建一个目录data(假定为c:\mysql)
    创建后不要在其中放置任何文件
  2. 创建一个配置文件my.ini放在mysql的根目录下
[client]
port=3306
default-character-set=utf8

[mysqld] 
# 设置为MYSQL的安装目录 
basedir = "C:/MySQL"
# 设置为MYSQL的数据目录 
datadir = "C:/MySQL/data"

port=3306
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER

#开启查询缓存
explicit_defaults_for_timestamp=true
  1. 设置环境变量, 加入mysql关键目录
    新建2个用户变量:
    MYSQL_HOME 值:C:\MYSQL
    MYSQL_PATH 值:%MYSQL_HOME%\bin
    修改用户变量 Path, 加入:%MYSQL_PATH%;%MYSQL_HOME%\lib;%MYSQL_HOME%\lib\plugin;
    修改系统变量Path, 加入:%MYSQL_PATH%;%MYSQL_HOME%\lib;%MYSQL_HOME%\lib\plugin;

  2. 安装mysql
    用管理员身份启动cmd
    (1) 安装
    mysqld -install
    成功的话会提示: Service successfully installed.
    (2) 初始化
    mysqld --initialize-insecure
    执行的时候可以看到mysql在往新建的data目录里写入文件。
    如果data目录里已经有文件存在,会终止并提示data目录有文件,无法进行。这时只需要把data目录里的文件全删掉再重新执行命令就行了.
    (3) 启动mysql
    net start mysql

  3. 修改root 用户密码
    初始安装后, root 用户是没有密码的。用mysql -u root -p 登录,要求输密码时直接按回国即可。
    设置密码。

  4. 为wordpress创建database, 用户,给用户分配此database的操作权限
    从这里开始,跟installer安装的情况就没有区别了。
    特别注意,一定要记得要把新建的datase的操作权限分配给新建的用户。不然会有500错误。

4. 安装、配置wordpress

wordpress 的安装配置跟Linux下基本是一样的。

  1. 下载wordpress
    官网上总是放的最新版,如果想下载指定的版本,可以到这里:
    Release Archive – WordPress.org
  2. 将下载的wordpress解压缩到web服务根目录(默认是c:\inetpub\wwwroot)
  3. 修改wp-config.php配置文件
    原文件名是wp-config-sample.php, 拷为wp-config.php
    打开文件,修改database相关的部分
    在这里插入图片描述
    保存。
  4. 打开http://host/wp-admin/install.php
    后续就一样了。

三、遇到的错误提示及原因分析

  1. 403错误
    从client端不带文件名访问时出错。 在这里插入图片描述
    从server端访问,错误描述更详细
    在这里插入图片描述
    错误描述容易误导人,按它的建议,需要开启目录浏览功能。当然不能这样。
    实际的问题是:php配置时忘记把默认文档改成index.php了,导致IIS在/wp-admin/下没找到合适的默认文档,所以会认为用户是要浏览目录。配置默认文档后就解决了.

  2. 502错误
    client端忘记截屏了,server端浏览器上显示如下。怀疑是Visual C++ Redistributable与php版本不兼容造成的。改用php8.0后错误消失。
    client端的错误提示一般都比较简略,在server端就清晰得多,所以有问题了,在server端复现一下会有帮助
    在这里插入图片描述
    PS:关于版本问题,可能不是root cause, 因为想补截一个图,我把php8.2又换回来了,神奇的是,它居然可以用了。待进一步研究
    在这里插入图片描述

  3. 500 错误
    有好几种不同的500错误
    在这里插入图片描述
    这个根据提示,在IIS里正确配置php文件与php-cgi.exe的映射后解决了。
    还有一个忘记截屏了,是忘记给wordpress的数据库user做授权引起的。

  4. 无法上传media文件
    这个在Linux 服务器上也遇到的, 当时是因为忘记把/var/www/html/wp-content 这个目录及下辖的文件用户改为apach引起的。
    同样的问题在Windows Server上也发生了,但是解决起来困难了很多。
    (1) 不管从client还是server的浏览器上,提示都很简单,只知道发生错误了。
    在这里插入图片描述
    依据之前的经验,推测是文件权限引起的。但是试过了,主题可以正常安装,说明文件夹权限不是问题。试着把wp-content\uploads 目录删掉,然后在setting 里去年/勾选"Organize my uploads into month- and year-based folders", 发现uploads目录被自动创建了,而且年、月目录也被自动创建了。更进一步确认了不是目录权限造成的。
    在server端浏览器上测试时,发现wordpress提供浏览器内置功能上传模式, 类似这样: http://host/wp-admin/media-new.php?browser-uploader
    用这个更糟糕,直接报500错误,但是有意思的是,在这个模式下,切换到multi-file uploader后,它给出了有用的错误信息:Missing a temporary folder.
    在这里插入图片描述
    这一下方向就明确了。
    网上查到一篇解决方案,啰啰嗦嗦一长篇(原文链接),其实就是说要在wp-config.php里加上一句 define('WP_TEMP_DIR', dirname(__FILE__) . '/wp-content/temp/');, 然并卵。
    直到看到这篇文章(原文), 才真正明白问题的根源是:默认 php 进程会读写系统的临时目录(Windows 默认为 C:/windows/temp,Linux 为 /tmp),显然只需要修改php.ini中的这个配置就可以了:
    在这里插入图片描述
    修改后实测成功。
    明白原理后,自然会想,如果不改php.ini配置, 直接修改系统临时目录的访问权限应该也行得通(纯测试,正式环境这样肯定不是好办法) 。
    实测证实了此想法。
    先注释掉php.ini的修改,然后修改c:\windows\temp的权限,增加IUSR用户的读写权限,重启IIS后,仍然可以成功上传。注意,实测下来加用户组IIS_IUSRS用户组无效。
    在这里插入图片描述

扫描二维码推送至手机访问。

版权声明:本站部分文章来自AI创作、互联网收集,请查看免责申明

本文链接:https://www.yyzq.team/post/301350.html

标签: windowsphp
分享给朋友: