lnmp架构
lnmp
LNMP架构概述
1.什么是LNMP
LNMP 是一套技术的组合, L=Linux、 N=Nginx、 M=MySQL、 P=PHP
2. LNMP架构是如何工作的
首先 Nginx 服务是不能处理动态请求,那么当用户发起动态请求时, Nginx 又是如何进行处理的。
当用户发起 http 请求,请求会被 Nginx 处理,如果是静态资源请求 Nginx 则直接返回,如果是动态请求 Nginx 则通过 fastcgi 协议转交给后端的 PHP 程序处理,具体如下图所示
3.Nginx与Fast-CGI工作流程
1.用户通过 http 协议发起请求,请求会先抵达 LNMP 架构中的 Nginx
2.Nginx 会根据用户的请求进行判断,这个判断是有 Location 进行完成
3.判断用户请求的是静态页面, Nginx 直接进行处理
4.判断用户请求的是动态页面, Nginx 会将该请求交给 fastcgi 协议下发
5.fastgi 会将请求交给 php-fpm 管理进程, php-fpm 管理进程接收到后会调用具体的工作进程 warrap
6.warrap 进程会调用 php 程序进行解析,如果只是解析代码 php 直接返回
7.如果有查询数据库操作,则由 php 连接数据库(用户 密码 IP)发起查询的操作
8.最终数据由 mysql->php->php-fpm->fastcgi->nginx->http->user
LNMP安装部署
1. 创建www统一用户
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -s /sbin/nologin -M -u 666 -g 666
[root@web01 ~]# id www
uid=666(www) gid=666(www) 组=666(www)
2.使用官方仓库安装nginx
[root@web01 ~]# cat /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
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
[root@web01 ~]# yum install nginx -y
3.启动Nginx并加入开机自启动
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
4.使用第三方拓展源安装php7.1
[root@nginx ~]# yum remove php-mysql-5.4 php php-fpm php-common
[root@nginx ~]# cat /etc/yum.repos.d/php.repo (必须配置这个才能下载)
[php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
[root@nginx ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
'检测
[root@web01 ~]# php-fpm -v
5. 配置php-fpm用户与nginx用户保持一致
[root@web01 ~]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
[root@web01 ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
6. 启动php-fpm并加入开机自启动
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm
7. 安装Mariadb数据库
[root@web01 ~]# yum install mariadb-server(服务端) mariadb(客户端) -y
8.启动Mariadb数据库并加入开机自启动
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb
9.配置Mariadb账号密码
[root@web01 ~]# mysqladmin password 'msy123'
`也可以这么创建,不仅创建,还移除匿名用户等
[root@web01 ~]# mysql_secure_installation
[root@web01 ~]# mysql -uroot -pmsy123
mysql基础命令
#查看当前mysql有哪些用户
MariaDB [(none)]> select user,host from mysql.user; 注意分号啊啊啊啊
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | web01 |
| root | web01 |
+------+-----------+
select user,host from mysql.user;
查询 mysql库里的user表里的 user和host字段的内容
mysql定义一个用户是由2个条件组成的
用户名+登陆主机
登录mysql
[root@web01 ~]# mysql -uroot -pmsy123
使用指定IP登录
[root@web01 ~]# mysql -uroot -pmsy123 -h10.0.0.7
查看当前有哪些数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
查看库里面有哪些表
MariaDB [(none)]> show tables from mysql;
也可以切换用户查看表 use mysql ----> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows in set (0.00 sec)
查看表里有哪些字段
MariaDB [mysql]> desc user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) | NO | | 0 | |
| plugin | char(64) | NO | | | |
| authentication_string | text | NO | | NULL | |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.00 sec)
退出
exit
Fastcgi语法
环境配置
nginx与php集成
把之前的文件都先移走到tmp下 方便测试
'配置文件
[root@web01 conf.d]# cat php.conf
server {
listen 80;
server_name php.oldboy.com;
root /code;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;(默认端口9000)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
'根据配置文件创建目录
[root@web01 ~]# mkdir /code
'做域名解析:10.0.0.7 php.oldboy.com
'重载Nginx
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# systemctl enable nginx
'启动php-fpm,并加入开机自启
[root@web01 conf.d]# systemctl start php-fpm
[root@web01 conf.d]# systemctl enable php-fpm
'准备一个php文件,测试nginx与php是否集成成功
[root@web01]# cat /code/page.php
<?php
phpinfo();
?>
'可以在浏览器上输入:php.oldboy.com/page.php测试
连接数据库
'准备一个php文件,测试能否正常连接数据库
[root@web01 /etc/nginx/conf.d]# vim /code/mysql.php
<?php
$servername = "localhost";
$username = "root";
$password = "msy123";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "php连接MySQL数据库成功";
?>
[root@web01]# chown -R www:www /code/
部署博客Wordpress
'把里面的内容先清空 转tmp 配置文件
[root@web01 /etc/nginx/conf.d]# ls
php.conf
[root@web01 /etc/nginx/conf.d]# cp php.conf wordpress.conf
[root@web01 /etc/nginx/conf.d]# ls
php.conf wordpress.conf
[root@web01 /etc/nginx/conf.d]# cat wordpress.conf
server {
listen 80;
server_name blog.oldboy.com;
root /code/wordpress;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
'根据nginx中定义的内容,创建站点目录并且进行授权
[root@web01 ~]# cd /code
[root@web01 /code]# ls
mysql.php page.php
[root@web01 /code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@web01 /code]# tar xf latest-zh_CN.tar.gz
[root@web01 /code]# ls
latest-zh_CN.tar.gz mysql.php page.php wordpress
刚好解压出一个需要的文件夹
'更改属主属组
查看属主属组
[root@web01 /code]# ps aux|grep php
[root@web01 /code]# ps aux|grep nginx
`之前做过这些就不用重复做了
#注意:如果没有该用户,启动一定会报错
[root@web01 code]# groupadd -g 666 www
[root@web01 code]# useradd -u666 -g666 www
`修改nginx与php-fpm管理进程,的运行身份为www
[root@web01 code]# sed -i '/^user /c user www;' /etc/nginx/nginx.conf
[root@web01 code]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
[root@web01 code]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
`一定要重启才生效
[root@web01 code]# systemctl restart nginx
[root@web01 code]# systemctl restart php-fpm
'授权代码为www
[root@web01 code]# chown -R www.www /code/wordpress
!!hosts域名解析!!
创建数据库
[root@web01 /code]# mysql -uroot -pmsy123 #进数据库
MariaDB [(none)]> create database wordpress; #创建一个库,名称叫wordpress
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases; #查询该台数据库服务有多少个库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)
根据网站提示登录
用户名:root
密码:msy123
'安装好之后,查看库里面的表
MariaDB [(none)]> use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [wordpress]> show tables;
+---------------------------+
| Tables_in_wordpress |
+---------------------------+
| oldboy_commentmeta |
| oldboy_comments |
| oldboy_links |
| oldboy_options |
| oldboy_postmeta |
| oldboy_posts |
| oldboy_term_relationships |
| oldboy_term_taxonomy |
| oldboy_termmeta |
| oldboy_terms |
| oldboy_usermeta |
| oldboy_users |
+---------------------------+
12 rows in set (0.00 sec)
MariaDB [wordpress]>
'查看之前的配置信息
[root@web01 /code]# cat wordpress/wp-config.php
换主题遇到的问题
'点击外观-添加-上传主题-选择文件-上传 发现会报413 Request Entity Too Large
'因为nginx对上传的文件大小做了限制
`解决nginx上传文件大小限制
[root@web01 /etc/nginx/conf.d]# vim wordpress.conf
server {
listen 80;
server_name blog.oldboy.com;
root /code/wordpress;
client_max_body_size 100m;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
'PS:client_max_body_size 100m; #默认nginx仅支持上传 1m大小的文件
[root@web01 code]# systemctl restart nginx
继续上传主题--启用
`wordpress安装部署报错总结
'问题现象1:
浏览器访问页面没有显示,打不开
排查过程:
查看nginx和php进程是否存在
查看nginx和php运行用户是否为www
查看代码目录是否为www
ping 域名发现能通
telnet 域名 端口
查看nginx运行的端口是否为80
查看防火墙是否开启
iptables -nL
systemctl status firewalld
问题原因:
防火墙没关闭
'问题现象2:
填写完数据库账号密码信息页面之后,提示无法写入php配置文件
排查过程:
查看nginx和php进程是否存在
查看nginx和php运行用户是否为www
问题原因:
nginx和php运行用户没有修改
修改后忘记了重启进程
'问题现象3:
安装成功后访问页面提示数据库连接错误
问题原因:
创建好wordpress之后,数据库的信息已经被写死到配置文件里了。
然后手动修改了数据库的密码,导致配置文件里账号密码和数据库目前的账号密码不一致了
解决方法:
修改数据库密码为课上讲的123456
mysqladmin -uroot -p1 password 123456
wecenter知乎
[root@web01 /etc/nginx/conf.d]# cp wordpress.conf wecenter.conf
[root@web01 /etc/nginx/conf.d]# cat wecenter.conf
server {
listen 80;
server_name zh.oldboy.com;
root /code/zh;
client_max_body_size 100m;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
'下载软件
[root@web01 code]# rz -E WeCenter_3-2-1.zip
[root@web01 /code]# ls
latest-zh_CN.tar.gz page.php wordpress
mysql.php WeCenter_3-2-1.zip
[root@web01 code]# unzip WeCenter_3-2-1.zip
[root@web01 code]# mv WeCenter_3-2-1 zh
[root@web01 code]# chown -R www.www zh/
[root@web01 code]# chown -R www:www /code/
重启nginx
hosts域名解析!!!
'创建数据库
[root@web01 code]# mysql -uroot -pmsy123
MariaDB [(none)]> create database zh;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
| zh |
+--------------------+
6 rows in set (0.00 sec)
自己安装就行 然后登陆 我把用户名从oldboy改成weekendmeng了
edusoho
1.配置
[root@web01 code]# cat /etc/nginx/conf.d/edu.conf
server {
listen 80;
server_name edu.oldboy.com;
root /code/edusoho/web;
client_max_body_size 200m;
location / {
index app.php;
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/udisk {
internal;
root /code/edusoho/app/data/;
}
location ~ ^/(app|app_dev)\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
}
# 配置设置图片格式文件
location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
# 过期时间为3年
expires 3y;
# 关闭日志记录
access_log off;
# 关闭gzip压缩,减少CPU消耗,因为图片的压缩率不高。
gzip off;
}
# 配置css/js文件
location ~* \.(css|js)$ {
access_log off;
expires 3y;
}
# 禁止用户上传目录下所有.php文件的访问,提高安全性
location ~ ^/files/.*\.(php|php5)$ {
deny all;
}
# 以下配置允许运行.php的程序,方便于其他第三方系统的集成。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
[root@web01 /etc/nginx/conf.d]# nginx -t
[root@web01 /etc/nginx/conf.d]# systemctl restart nginx
2.下载软件,并且授权
[root@web01 code]# wget http://download.edusoho.com/edusoho-8.2.17.tar.gz
[root@web01 code]# tar xf edusoho-8.2.17.tar.gz
[root@web01 code]# chown -R www.www edusoho
3.调整php的上传大小
[root@web01 ~]# vim /etc/php.ini
post_max_size = 200M
upload_max_filesize = 200M
[root@web01 code]# systemctl restart php-fpm
4.解析
`这几个可以搞搞
phpmyadmin https://www.phpmyadmin.net/
zblog https://www.zblogcn.com/
wordpress https://cn.wordpress.org/
wecenter http://www.wecenter.com/downloads/
edusohu http://www.edusoho.com/open/show