8、网站的LNMP架构、Nginx反向代理

1. LNMP架构是什么

  1. L----Linux操作系统
    1)需要注意关闭selinux和iptable
    2)保证/tmp目录是1777权限
  2. N----Nginx
    作用:处理用户的静态资源请求
  3. P----PHP
    作用:
    1)处理动态的页面请求
    2)负责和数据库建立关系
  4. 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,将usergroup改为nginx。保证nginxphp服务的管理用户一致。


启动服务

systemctl start php-fpm

2.3.2 使用旧版php,自行安装php-fpm

yum -y install php php-fpm

编写配置文件/etc/php-fpm.d/www.conf,将usergroup改为nginx。保证nginxphp服务的管理用户一致。


启动服务

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,访问数据库使用localhost127.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 可以支持的协议

  1. HTTP
  2. HTTPS
  3. TCP
  4. websocket:http1.1长链接通讯协议
  5. GRPC:go语言远程过程调用
  6. POP/IMAP:邮件收发
  7. 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;
}

你可能感兴趣的:(8、网站的LNMP架构、Nginx反向代理)