Windows Server 2012 R2下IIS8+MySQL8+PHP7搭建WordPress

分享在WMIP环境下搭建WordPress时踩过的一些坑

1. 安装并启用IIS 8.5

IIS8的启用很简单,只要一路Next下去就行了

首先在服务器管理器里面点添加角色或功能,在选择本机服务器之后
添加Web Server角色

确认添加该角色之后会为自动添加IIS管理器的功能安装, 如果出现什么意外没有装上IIS管理器的话, 可以在服务器管理器的添加功能->管理工具->IIS管理控制台里单独重新安装

勾选需要安装并启用的IIS功能

PHP场景的IIS使用默认设置即可, 基本上都不会用到. 建议启用健康与诊断里的内容, 日志记录基本靠它
性能(Performance)里面的静态内容指并不会根据用户输入发生改变的文件,比如HTML, 图像,或者前端脚本之类的, 当文件第一次被请求的时候, IIS会将其压缩然后放入临时文件夹中, 下次再有 人请求此文件时直接从临时文件夹中取出压缩后的版本而不用重新执行压缩的过程。动态内容指存储于数据库并且当用户浏览时动态生成或者改变的内容, 即来自ASP.NET, PHP, ASP或其他框架的响应。每一次请求,主机都会对请求的内容——可能是存放在文件系统中的静态文件,也可能是ISAPI返回的内容——进行压缩,而不会对其进行缓存。这个压缩比率因主机性能不同而会有所调整,所以我们在请求js文件的时候才会发现js文件有时压缩有时不压缩的情况。
简书上有人给出这样的解释:

两种压缩方式

动态压缩对于配置在dynamicTypes中的mime类型的请求启用,即每一次请求,server都会对请求的内容进行压缩但是不进行缓存。而静态压缩对于配置在staticTypes中的mime类型的请求启用,当文件第一次被请求时,IIS会将其压缩,然后放入临时文件夹,之后再次对该文件的请求将直接读取临时文件夹中压缩后的版本而不是重新压缩。默认情况下IIS是采取static compression和pre-compression方式的并且会自动保存静态内容在硬盘上。至于哪些类型的文件使用动态压缩哪些使用静态压缩是可以在applicationHost.config(目前只在Windows找到了IIS Express的这个文件但是不能用于IIS)中设置的。这种压缩方式依赖于两个Modules,dynamic module(compdyn.dll)和static module(compstat.dll)。

因此静态内容压缩看MIME类型,而动态内容压缩是为每个请求启用,他们即依靠内置于Windows的gzip库进行压缩(c:\windows\system32\inetsrv\gzip.dll), 可以在IIS管理器中通过[压缩]部分来选择启用或者禁用

下一步之后确认安装并等待重启

完成之后可以去http://localhost 看看IIS的欢迎页是否能正常显示
IIS的启用就完成了

2. 为IIS 8.5启用PHP 7

官网下载PHP(现在最新版本是7.2)

现在我们需要选择none thread(非线程安全)和thread(线程安全)的版本:
在IIS环境中PHP有两种执行方式:ISAPI和FastCGI.
FastCGI执行方式是以单一线程(php-cgi.exe)来执行操作, 所以不需要进行线程的安全检查, 除去线程安全检查的防护反而可以提高执行效率. 所以, 如果是以FastCGI(IIS下一般都是这种执行方式)执行PHP, 建议下载非线程安全的PHP.
线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的. ISAPI也可以说是DLL模式, 依靠IIS特有的ISAPI接口, 靠w3wp.exe进程调用,PHP没有单独的进程, 所以需要使用Thread Safe的PHP版本.

解压zip文件到PHP安装目录下, 备份PHP目录下的php.ini-developer,并重命名为php.ini
编辑php.ini:

;extension_dir的值即是php安装目录下的ext目录
extension_dir = "C:\php\ext" 

;doc_root的值应设为IIS中设置的Web站点的主目录
doc_root = "C:\inetpub\wwwroot"

;设置错误日志
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
html_errors = On
log_errors = On
log_errors_max_len = 1024

;设置错误日志的保存位置
error_log = "D:\Program Files\PHP\v7.2.6\log\error_of_php.log"

;POST数据大小限制
post_max_size = 50M

;上传文件的临时存储位置,需要为该目录设置IIS_IUser和IUser权限,因为文件上传了会继承该目录的权限,因此需要给予和WordPress目录相同的权限,否则无法访问所上传的文件
upload_tmp_dir ="C:\tempUploads"

;最大文件上传大小
upload_max_filesize = 100M

;动态扩展库
;extension=bz2
extension=php_curl
extension=fileinfo
extension=php_gd2
;extension=gettext
extension=gmp
;extension=intl
extension=imap
;extension=interbase
;extension=ldap
extension=php_mbstring
extension=php_exif      ; Must be after mbstring as it depends on it
extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
;extension=pgsql
;extension=shmop
;extension=snmp
;extension=soap
extension=php_sockets
;extension=sqlite3
extension=xmlrpc

;设置时区_支持的时区列表 http://php.net/manual/en/timezones.php
date.timezone = "Asia/Shanghai"

在环境变量里面添加一个PHP根目录

C:\Program Files\PHP\v7.2.6

环境变量设置成功之后可以在CMD中直接使用php命令
可以试试用php -v来检查php的路径是否正确被正确设置

然后添加一个IIS的处理程序映射, 单击添加模块映射

模块映射设置如下, 将php文件交由可执行文件即PHP根目录下的php-cgi.exe来执行
在IIS站点目录里建立一个index.php, 为默认站点添加一个默认文档index.php
index.php内容就一行<?php phpinfo();?>
在http://localhost/index.php看到PHP配置详细的话, PHP的配置就算完成了

3. 安装并配置MySQL 8

这里下载MySQL的安装器, 一路Next下去
按照自己需要配置即可, 唯一需要说明的是如果安装的时候没有采用传统的native验证方式, 而使用了向导推荐的caching-sha2的认证方式的话, WordPress和MySQL的Workbench连接数据库会认证失败

要根本上解决这个问题只能等客户端慢慢支持该插件, 或者安装的时候就使用Legacy方式认证, 如果希望改变已有用户的认证方式,可以在CLI中以mysql -u root -p登陆之后使用SQL来更改用户

#修改认证插件 
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;
#更新密码(mysql_native_password模式)    
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{NewPassword}';

4. 安装并配置WordPress

WordPress简体中文官网下载最新版本WordPress(现在最新版本是4.9.4)
解压WordPress到目录中(比如c:\inetpub\wwwroot\wordpress), 给IIS_IUser和IUser读写权限
现在, 更改wp-config.php来建立一个数据库与WordPress之间的连接
在安装路径(比如c:\inetpub\wwwroot\wordpress)找到wp-config-sample.php, 将文件wp-config-sample.php重命名为wp-config.php
修改之

<?php 
// ** MySQL settings ** // 
define('DB_NAME', 'wordpressSchema');    // 数据库Schema名 
define('DB_USER', 'wordpressUser');     // 拥有该Schema权限的用于连接数据库的用户的用户名 
define('DB_PASSWORD', 'wordpressPW'); // 该用户的密码
define('DB_HOST', 'localhost');    // 数据库实例所在的服务器

define('DB_CHARSET', 'utf8mb4');  // 指定字符集
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', 'utf8mb4_bin');
$table_prefix  = 'wow_It_is_WP_';   // 数据表前缀

//访问https://api.wordpress.org/secret-key/1.1/salt/ 
//在下面加盐
define('AUTH_KEY',         'ThsrO$qa1#yT mtPZb)CS]]q%lyB!MWU$m|^;-P}<P2D[ g$i`#>]f2zFvwzVJ%0');
define('SECURE_AUTH_KEY',  '$m2?*%?vy?@8rHAX;t/IEtlh!],b9(~^MxxB.ec|9|}9nKrvKhGx$nE2$Y7gt~]W');
define('LOGGED_IN_KEY',    '<zgXP:iG{ZUb@qCK36(6p%he5#]msP97v(lOOT92vQ~m0@fCT>kd>_/c8 lD7o4T');
define('NONCE_KEY',        'BVC)JK8?@|j+M zlm.s$E#gZ,C` -V9[S-FKseDL{#z-nyzolO}~U%Q.$,?82&:G');
define('AUTH_SALT',        'pds6wv?L.?E=r/hgVOcF{-?]+NF2)*X2eR>Lh Ud%o<c*^WL`w0MP` ug{3Ej0f+');
define('SECURE_AUTH_SALT', 'koj._j<I,E|cOU>6`y~,;X+NX.4@sa,KoNK$R;i7^ ;aK#@tK{Hu^ %iE6umB>26');
define('LOGGED_IN_SALT',   '@+x]dzAFt+|Rf%dF3nUUxhkClVVFS?U4iZ.+}GIA1cvx!HrJ@%~O<$F$a1HSZ2Y}');
define('NONCE_SALT',       'D1G-)4-RCF~#1-{:~&-;lh|%u*bpG+u_|R<vl]sm_~n6ngt;_sR%1l0lt;^V6Q<wy)'); 
define('WP_DEBUG', false); 
/* That's all, stop editing! Happy blogging. */ 
/** Absolute path to the WordPress directory. */ 
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); 
/** Sets up WordPress vars and included files. */ 
require_once(ABSPATH . 'wp-settings.php'); 
?>

浏览器的地址访问http://localhost/wp-admin/install.php, 开始图形向导安装, 剩下的就是一路Next了

安装完成后, 需要为中文URL启用编码支持.

因为URL请求时用了GBK编码,需要用mb_convert_encoding()把请求编码转成UTF-8

WordPress 4.9的\wp-includes\class-wp.php

里面有$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']这个两个输入参数

把这两行的输入获取代码改为如下:

//将$_SERVER['PATH_INFO']转码为UTF-8
$pathinfo = isset( $_SERVER['PATH_INFO'] ) ? mb_convert_encoding($_SERVER['PATH_INFO'], "UTF-8", "GBK") : '';
//将$_SERVER['REQUEST_URI']转码为UTF-8
list( $req_uri ) = explode( '?', mb_convert_encoding($_SERVER['REQUEST_URI'], "UTF-8", "GBK") );

至此, 搭建工作就全部完成了, 可以随意使用WordPress发表博客了

Published by