1. LNMP架构是什么
- L----Linux操作系统
1)需要注意关闭selinux和iptable
2)保证/tmp目录是1777权限 - N----Nginx
作用:处理用户的静态资源请求 - P----PHP
作用:
1)处理动态的页面请求
2)负责和数据库建立关系 - M----Mysql数据库
作用:存储用户的字符串数据信息
2. LNMP架构部署
2.1 Nginx服务
配置官方yum源
vim /etc/etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
yum安装软件
yum -y install nginx
2.2 Mysql部署
参见博文https://www.jianshu.com/p/4bbd649c5da1
2.3 PHP yum部署
2.3.1 安装新版PHP
卸载自带的php软件
yum remove php-mysql php php-fpm php-common
更新yum源
yum -y install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
安装php及必要组件
yum -y install php72w php72w-cli php72w-common php72w-fpm php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml php72w-mysqlnd php72w-opcache php72w-pecl-memcached php72w-pecl-redis php72w-pecl-mongodb
编写配置文件/etc/php-fpm.d/www.conf
,将user
、group
改为nginx
。保证nginx
和php
服务的管理用户一致。
启动服务
systemctl start php-fpm
2.3.2 使用旧版php,自行安装php-fpm
yum -y install php php-fpm
编写配置文件/etc/php-fpm.d/www.conf
,将user
、group
改为nginx
。保证nginx
和php
服务的管理用户一致。
启动服务
systemctl start php-fpm
2.3.3 修改允许用户上传的文件大小(可选)
修改/etc/php.ini
文件,将upload_max_filesize
改为需要的值
upload_max_filesize = 5M
重启服务
systemctl restart php-fpm
2.3.4 更改php session目录权限
chown nginx:nginx -R /var/lib/php/session
3 LNMP架构原理
4 实现LNMP间建立关系
4.1 实现nginx和php关联
编写nginx的server配置文件/etc/nginx/conf.d/blog.conf
location ~ \.php$ {
root /html/blog;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
参数解释:
root:
站点目录
fastcgi_index:
用户请求xxx.com/.php时,默认的页面
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name:
fastcgi接口同时传递用户的url和uri
fastcgi_pass:
1.php服务的地址和端口号
2.socket文件,格式为unix:socket文件的绝对路经
include fastcgi_params:
引入/etc/nginx/fastcgi_params文件中定义的变量,
$document_root和$fastcgi_script_name就是其中定义的变量。
4.2 实现php和mysql关联
4.2.1 使用专用mysql服务器
实现web服务器中的php与数据库服务器中的mysql关联。
编写php代码文件/html/blog/test_mysql.php
修改网页代码文件中数据库的位置,以/html/blog/wp-config.php
为例
/** WordPress数据库的名称 */
define( 'DB_NAME', 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER', 'wordpress' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD', '123456' );
/** MySQL主机 */
define( 'DB_HOST', '172.16.1.51' );
在mysql中创建用户、库并授权
[(none)]> create database wordpress;
[(none)]> create user wordpress@'172.16.1.%' identified by '123456';
[(none)]> grant all on wordpress.* to wordpress@'172.16.1.%' ;
访问php测试页面进行测试
4.2.2 php和mysql使用同一服务器
编写php代码文件/html/blog/test_mysql.php
,访问数据库使用localhost
或127.0.0.1
。
-
localhost
使用socket访问 -
127.0.0.1
使用tcp访问
修改/etc/php.ini
,修改socket
文件位置,重启php-fpm
服务
pdo_mysql.default_socket=/tmp/mysql.sock
mysqli.default_socket =/tmp/mysql.sock
systemctl restart php-fpm
在mysql中创建用户、库并授权
[(none)]> create database wordpress;
[(none)]> create user wordpress@'localhost' identified by '123456';
[(none)]> grant all on wordpress.* to wordpress@'localhost' ;
访问php测试页面进行测试
5 部署搭建网站页面
5.1 获取代码信息
www网站页面 http://www.dedecms.com/
bbs网站页面 http://www.discuz.net/forum.php
blog网站页面 https://cn.wordpress.org/
wecenter网站页面 https://www.wecenter.com/
5.2 将代码放入站点目录
5.3 修改站点目录权限
chown -R nginx.nginx /html/blog/
5.4 进行数据库配置
[(none)]> create database wordpress;
[(none)]> create user wordpress@'localhost' identified by '123456';
[(none)]> grant all on wordpress.* to wordpress@'localhost' ;
5.5 配置nginx站点配置文件
修改默认location
的站点主页,让网站目录优先使用index.php
作为默认页面
location / {
root /html/blog;
index index.php index.html;
}
5.5 进行网站页面初始化
6 典型问题
6.1 用户上传附件报错问题
1)修改nginx配置
vim /etc/nginx/conf.d/blog.conf
server {
...
client_max_body_size 5M;
...
2)修改php配置文件
修改/etc/php.ini
文件,将upload_max_filesize
改为需要的值
upload_max_filesize = 5M
6.2 登录页面循环登录问题
原因:php的session目录权限问题,导致无法读取session信息
措施:更改session目录权限
chown nginx:nginx -R /var/lib/php/session
7 用户上传目录向存储服务器迁移
7.1 配置存储服务器
增加nginx用户,保证uid与web服务器侧一致
useradd -u 998 nginx -M -s /sbin/nologin
修改/etc/exports
文件
/data/blog 172.16.1.0/24(rw,sync,anonuid=998)
创建共享文件夹
mkdir -p /data/blog
chown -R nginx.nginx /data/blog
7.2 配置web服务器
将/html/blog/wp-content/uploads/
目录迁移至存储服务器
proxy_set_header Host remote_addr;
mv /html/blog/wp-content/uploads/* /tmp/uploads
mount 172.16.1.31:/data/blog /html/blog/wp-content/uploads/
mv /tmp/uploads/* /html/blog/wp-content/uploads/
8 Nginx反向代理
8.1 可以支持的协议
- HTTP
- HTTPS
- TCP
- websocket:http1.1长链接通讯协议
- GRPC:go语言远程过程调用
- POP/IMAP:邮件收发
- RTMP:流媒体、直播、点播
8.2 常用的代理模块
代理协议 | 模块 | 语法 | 后端服务器类型 |
---|---|---|---|
HTTP/HTTPS | ngx_http_proxy_module | proxy_pass | Http Server |
HTTP/HTTPS | ngx_http_fastcgi_module | fastcgi_pass | php Server |
HTTP/HTTPS | ngx_http_uwcgi_module | uwcgi_pass | python Server |
websocket | ngx_http_proxy_module | proxy_pass | socket |
grpc | ngx_http_v2_module | grpc_pass | grpc server |
8.3 HTTP代理常用优化参数
8.3.1 必选参数
将配置写入新文件,调用时使用inclued
调用
vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_connect_timeout
后端服务器连接的超时时间,发起握手等候响应超时时间,默认60s
proxy_read_timeout
连接成功后,等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_send_timeout
后端服务器数据回传时间,就是在规定时间之内后端服务器必须传完所有的数据
在站点配置文件中调用参数
location / {
...
include /etc/nginx/proxy_params
}
8.3.2 与后端长连接(可选)
普通web后端
upstream http_backend {
server 172.16.0.1:8080;
# 为每个server开启16个长连接
keepalive 16;
}
server {
...
location / {
# 使用http1.1协议
proxy_http_version 1.1;
# 清除Connection头字段
proxy_set_header Connection "";
}
}
fastcgi后端
upstream fastcgi_backend {
server 172.16.0.1:8080;
# 为每个server开启8个长连接
keepalive 8;
}
server {
...
location / {
fastcgi_pass fastcgi_backend;
# 开启fastcgi长连接
fastcgi_keep_conn on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
8.3.3 修改文件描述符限制
vim /etc/security/limits.conf
* - nofile 65535
vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 65535;
...
events {
...
}
9 PHP优化
9.1 PHP配置文件
vim /etc/php.ini
错误日志设置
# 关闭php版本信息
expose_php = Off
# 屏幕不显示错误日志
display_errors = Off
# 记录PHP的每个错误
error_reporting = E_ALL
# 开启错误日志
log_errors = On
# 错误日志的写入位置
error_log = /var/log/php/php_error.log
# 调整时区
date.timezone = Asia/Shanghai
文件上传设置
# 允许文件上传
file_uploads = On
# 允许上传文件的最大大小
upload_max_filesize = 300M
# 允许客户端单个POST请求发送的最大数据
post_max_size = 300M
# 允许同时上传的文件的最大数量
max_file_uploads = 20
# 每个脚本执行最大内存
memory_limit = 128M
禁止危险函数执行(视情况)
disable_functions = chown,chmod,pfsockopen,phpinfo
Session 共享
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379"
9.2 PHP-FPM配置文件
vim /etc/php-fpm.d/www.conf
进程管理
# 动态调节php-fpm进程数
pm = dynamic
# 最大启动的php-fpm进程数
pm.max_children = 512
# 初始启动的php-fpm进程数
pm.start_servers = 32
# 最少的空闲php-fpm进程数
pm.min_spare_servers = 32
# 最大的空闲php-fpm进程数
pm.max_spare_servers = 64
# 每个进程能响应的请求数
pm.max_requests = 1500
# 进程释放资源的空闲时间
pm.process_idle_timeout = 15s
日志相关
# 进程相关日志
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
# 慢日志
# php脚步执行超过5s的文件
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log
开启php状态页面
pm.status_path = /phpfpm_status
# 需要同时修改nginx的server配置
location /phpfpm_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}