- 博客/
Nginx+php-fpm分离部署搭建wordpress
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。它是基于事件驱动模型,能承受万级别的高并发http请求。由于其负载性能很好,它合适做前端服务器,而高速处理静态类文件也是它的优点。nginx通过使用ngx_http_fastcgi_module模块也可以将客户端动态请求反向代理到后端的php-fpm,两者之间遵循FastCGI协议。
php-fpm(php-Fastcgi Process Manager)也是FastCGI的具体实现,可以独立运行并提供服务也提供了进程管理的功能。它的工作模式类似于prefork,包含 master 和 worker两种进程。 master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程响应一个请求,而且内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。nginx与php-fpm可以配置在同一台服务器上,也可以独立部署,在并发访问量不是很大时,建议采用后者的结合方式。
本文将分离部署nginx与php-fpm服务,拓扑模型如下:
php-fpm服务器上部署wordpress,并开启nfs服务,导出wordpress所在目录到nginx服务器,将nginx根目录挂载到导出目录,配置nginx实现只将php动态请求交由php-fpm服务器处理,其它静态文件则有nginx直接响应。
配置nginx服务器#
使用yum源安装$ yum install -y nginx
创建虚拟服务器配置文件
$ vim /etc/nginx/conf.d/vhost.conf
#http上下文中定义压缩;server中单独定义gzip on|off;
gzip_min_length 64;
gzip_comp_level 2;
gzip_types text/xml text/plain text/css application/json application/x-javascript application/xml application/xml+rss text/javascript;
gzip_proxied any;
#http上下文中定义fastcgi_cache,server|location中调用
fastcgi_cache_path /data/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;
server{
server_name www.ffu.com;
listen 80 ;
#实现https跳转
rewrite /(.*)$ https://www.ffu.com/$1;
}
server{
server_name www.ffu.com;
location / {
root /data/www/web1;
index index.php index.html;
}
#实现https
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/nginx.crt;
ssl_certificate_key /etc/nginx/nginx.key;
ssl_session_cache shared:sslcache:20m;
#定义访问策略
allow 192.168.196.0/24;
deny all;
#启用压缩功能
gzip on;
#文件操作优化
aio on;
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 50s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
#防盗链,只允许指定域名能引用资源
valid_referers none block server_names *.ffu.com ffu.* ~\.ffu\.;
if ($invalid_referer) {
return http://www.ffu.com/invalid.jpg;
#return 403;
}
location ~* \.php$ {
#反代php动态请求到后端php-fpm服务器上应用所在的目录
fastcgi_pass 192.168.196.131:9000;
fastcgi_param SCRIPT_FILENAME /data/www/app$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
#fastcgi缓存设置
fastcgi_cache fcgi;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
}
#对php-fpm的内嵌状态页请求直接反代到后端php-fpm服务器
location ~* ^/(status|ping) {
fastcgi_pass 192.168.196.131:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
#指定错误页面
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
实现ssl加密的私钥及证书申请,这里不再单独介绍,详情参考另一篇 关于使用openssl工具创建私有CA的博客
配置php-fpm服务器#
- 使用yum源安装
$ yum install -y php-fpm
$ vim /etc/php-fpm.d/www.conf
listen = 192.168.196.131:9000 <-- 监听的套接字
user = nginx
group = nginx
pm = dynamic
pm = static <--静态配置
pm.max_children = 256 <--开启的最大php进程数
pm.max_requests = 1024 <--在执行了1024个请求后重启worker进程
pm.status_path = /status
ping.path = /ping
服务器内存较大时建议直接计算后配置静态资源池,可以减少频繁prefork进程所带来的开销,提高服务质量
- 配置nfs服务
$ yum install nfs-utils rpcbind
$ useradd -r -s /sbin/nologin nginx <-- 创建nginx用户
$ id nginx
uid=996(nginx) gid=994(nginx) groups=994(nginx)
$ vim /etc/exports
#设定导出目录,只允许nginx服务器挂载,压缩所有远程用户为特定用户(nginx)的UID与GID
/data/www/app 192.168.196.129(rw,sync,all_squash,anonuid=996,anongid=994)
- 配置mysql
$ yum install mariadb-server
$ mysql_secure_installation <-- 安全初始化root账户密码
$ mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.2.7-MariaDB-log MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create database blogdb; <-- 创建wordpress的数据库
MariaDB [(none)]> grant all on blogdb.* to wpuser@'192.168.196.%' identified by '123456';
<-- 创建wordpress连接mysql的账户
- 安装wordpress
$ mkdir /data/www
$ tar xf wordpress-4.8-zh_CN.tar.gz -C /data/www/
$ cd /data/www
$ ln -sv wordpress app <--创建指向wordpress的软链接
$ chown -R nginx.nginx app/*
$ mv wp-config-sample.php wp-config.php
$ vim wp-config.php <-- 配置接口连接至mysql服务器
/** WordPress数据库的名称 */
define('DB_NAME', 'blogdb');
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');
/** MySQL数据库密码 */
define('DB_PASSWORD', '123456');
/** MySQL主机 */
define('DB_HOST', '192.168.196.131');
nginx服务器根目录挂载到nfs导出目录#
$ vim /etc/fstab
192.168.196.131:/data/www/app /data/www/web1 nfs defaults 0 0
$ mount -a
$ mount
192.168.196.131:/data/www/app on /data/www/web1 type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.196.131,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=192.168.196.131)
客户端浏览器访问wordpress#
开启各服务之后,在浏览器中访问并创建账户,即完成wordpress部署