lnmp架构安装(九)

本文详细介绍了LNMP架构的实现原理和安装步骤,包括Nginx、PHP和MariaDB的配置,以及WordPress和Wecenter等开源项目的搭建过程。重点讨论了Nginx与PHP的集成,通过fastcgi参数实现动态请求处理,并提供了PHP与MySQL数据库的连接示例。此外,还涵盖了edusoho教育平台的部署和配置。
摘要由CSDN通过智能技术生成

1. LNMP架构实现原理

在这里插入图片描述

2. LNMP架构安装

(1) 使用官方仓库安装Nginx

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1   

#安装Nginx
[root@nginx ~]# yum install nginx -y

(2)安装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

(3)安装Mariadb数据库

[root@nginx ~]# yum install mariadb-server mariadb -y

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vY07bcn1-1675611562881)(7BD3EE27F89C4590B7A6B7E8FA0D01E3)]

3. Nginx与php实现原理

fastcgi的服务端默认就是9000端口
php-fpm的一个管理进程
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smbTSRBd-1675611562883)(CAD09FC0E57D4CB4800D2E20691EC2AE)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEoZsSyU-1675611562884)(BDE34455359E49E5BBCAC1C5803F1BC3)]

fastcgi_param 告诉服务端要传哪个文件
SCRIPT_FILENAME:PHP固定的变量,告诉php上那个目录下面去找那个文件做解析,这里面存的是文件解析的一个路劲。
$document_root:读取的是一个root的路径(/code/)
$fastcgi_script_name:是用户请求的文件名(index.php )

所以/code/index.php整体打包抛给FastCGI的时候,传给了SCRIPT_FILENAME,PHP会读取这个变量,读取这个变量的结果就是/code/index.php
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ksHUsmXB-1675611562885)(A000E565BEE543E5ACFCADBBFD01162E)]

4. Nginx与PHP集成

(1)写脚本

[root@web01 conf.d]# cat php.conf 
server {
	listen 80;
	server_name php.oldboy.com;
	root /code; # 在全局配置一个root /code 可以在每个location都可以用 

	location / {
		index index.php index.html;
	}

	location ~ \.php$ {
		fastcgi_pass 127.0.0.1:9000; #通过哪个协议转出去  某个端口对应某个服务,需要做解析,返回给用户,把index.php文件的解析交给9000端口
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params; 
		# 在/etc/nginx 下有个文件是fastcgi_ params 传值 里面是参数和变量
把这里面的值传给后端php,没有这些东西,php就会出现空白页面
	}
}

小提示:

  • nginx把请求传给fastcgi服务端的时候,告诉服务端要做的事情
    同时告诉服务端fastcgi_parems里的变量,把这些变量里的值解析出来
  • php把路径的文件做一次解析,最后传给nginx,由nginx回传给用户

(2)根据配置文件创建目录

mkdir /code  

做域名解析:10.0.0.7	php.oldboy.com

(3)重载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

(4)启动php-fpm,并加入开机自启

[root@web01 conf.d]# systemctl start php-fpm
[root@web01 conf.d]# systemctl enable  php-fpm

(5)准备一个php文件,测试nginx与php是否集成成功

[root@web01 conf.d]# cat /code/page.php
<?php
	phpinfo();
?>

(6)进行测试

可以在浏览器上输入:php.oldboy.com/page.php测试

在这里插入图片描述

解释一下原理:

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBwGy0aC-1675611562887)(F55ACBF391B74343952D72FC7CB8CF91)]

  • 当输入域名的时候,浏览器自动加上http://php.oldboy.com:80/index.php
  • http收到请求,匹配到location ~ .php$ 然后把请求通过端口9000发送,并且把/code/index.php付给变量SCRIPT_FILENAME,传动给php,然后php会解析这个文件,又因为传送了fastcgi_params里面的参数和变量,所以php会返回内容给nginx,然后nginx在返回给用户。

问题:当输入http://php.oldboy.com:80/index.php这个域名的时候,还回去一个location \里面查找index.php吗?? 如果有这文件怎么办,是不是不应该有???还是直接匹配到第二个location里面???还是先进去第一个,然后跳到第二个???

5. PHP与MySQL的集成

(1)启动数据库

[root@web01 conf.d]# systemctl start mariadb
[root@web01 conf.d]# systemctl enable mariadb
[root@web01 conf.d]# mysqladmin password 'Bgx123.com'		#配置密码(默认mysql是空密码)
[root@web01 conf.d]# mysql -uroot -pBgx123.com				#使用账号和密码登录mysql

(2)准备一个php文件,测试能否正常连接数据库

[root@web01 /etc/nginx/conf.d]# vim /code/mysql.php
<?php
  $servername = "localhost";
  $username = "root";
  $password = "Bgx123.com";

  // 创建连接
  $conn = mysqli_connect($servername, $username, $password);

  // 检测连接
  if (!$conn) {
      die("Connection failed: " . mysqli_connect_error());
  }
  echo "php连接MySQL数据库成功";
  ?>

(3)测试mysql是否与php集成

用户在浏览器中输入:http://php.oldboy.com/mysql.php返回php连接MySQL数据库成功,
说明正常连接数据库。

6. Wordpress博客搭建

(1)书写配置文件

[root@web01 conf.d]# vim blog.oldboy.com.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;
	}
}

(2)把运行服务的用户改成www,以免权限出错,然后重启服务生效 创建站点目录并且进行授权,

上传代码:

[root@web01 conf.d]# cd /code
[root@web01 code]# wget https://cn.wordpress.org/wordpress-5.0.3-zh_CN.tar.gz
[root@web01 code]# tar xf wordpress-5.0.3-zh_CN.tar.gz  

修改nginx与php-fpm的运行用户为www,并授权代码属主和属组都为www

#注意:如果没有该用户,启动一定会报错
[root@web01 code]# groupadd -g 666 www
[root@web01 code]# useradd -u666 -g666 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 

(3)重启服务,并为代码目录授权为www

一定要重启才生效
[root@web01 code]# systemctl restart nginx
[root@web01 code]# systemctl restart php-fpm

最后授权代码为www
[root@web01 code]# chown -R www.www /code/wordpress

(4)数据库配置

[root@web01 conf.d]# mysql -uroot -pBgx123.com #进入数据库中  

MariaDB [(none)]> create database wordpress; #创建一个库,名称叫wordpress
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;	   	#查询该台数据库服务有多少个库

(5)在windows的hosts文件中给blog.oldboy.com做域名解析,在浏览器中输入blog.oldboy.com进入网站进行设置

10.0.0.7  blog.oldboy.com  

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGjLop4A-1675611562888)(4B8E41BF39AB448592CDAB42A49ACADC)]

(6)上传主题

点击外观-添加-上传主题-选择文件-上传 发现会报413 Request Entity Too Large
因为nginx对上传的文件大小做了限制

上传主题有可能会失败的原因:

第一种:nginx限制上传文件的大小

解决: 在server层添加 client_max_body_size 100m;

具体代码:

[root@web01 ~]# vim /etc/nginx/conf.d/blog.oldboy.com.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

重启使服务生效

[root@web01 code]# systemctl restart nginx  

继续上传主题–启用

成功上传

第二种:php限制文件上传的大小(默认最大是2M)

7. Wecenter知乎搭建

(1)书写代码,并且重启服务

书写代码:

[root@web01 conf.d]# cat zh.oldboy.com.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]# systemctl restart nginx

(2)上传代码,并修改代码目录的权限

[root@web01 code]# rz -E 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/

(3) 配置数据库

root@web01 code]# mysql -uroot -pBgx123.com
MariaDB [(none)]> create database zh;
MariaDB [(none)]> show databases;

(4)在windowns中host文件中配置域名解析,然后打开网页,填写信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WhSBadP1-1675611562889)(C1E1FDEDF8F447C2B3B15F1AA4B85C6F)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4xTM3PI6-1675611562890)(C6A91BD0CCAC4CB692D0BB6F260234F4)]

8. edusoho教育平台搭建

这个不用提前创建数据库,在登录到网页时,自己写的数据库名,可以自己设置,然后自动生成的。所以下面没有创建数据库这一个操作。
(1)配置nginx,并重启生效

配置nginx

[root@web01 code]# cat /etc/nginx/conf.d/edu.oldboy.com.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;
    }
}

重启nginx服务生效

systenctl restart nginx 

(2)下载软件,并且授权

下载软件:wget http://download.edusoho.com/edusoho-8.2.17.tar.gz  

加压软件:tar xf edusoho-8.2.17.tar.gz  

给代码目录授权:chown -R www.www edusoho

(3)调整php的上传大小,并且重启php-fpm生效

调整php的上传大小:

[root@web01 ~]# vim /etc/php.ini
post_max_size = 200M  # 资源存在本地的大小
upload_max_filesize = 200M  # 限制资源上传的大小

重启php-fpm使其配置生效

[root@web01 code]# systemctl restart php-fpm

(4)在windows中进行host解析,然后登录网站进行配置

10.0.0.7 edu.oldboy.com

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vIBpVRAc-1675611562890)(13204028E1C24D5BA89885DE8F03AA77)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIjRclEc-1675611562892)(744EC56949B44ECEBE485FBEAD4E6E19)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a7StwF76-1675611562893)(86F8C6FA7E7D49E09519CCC4DDC8BBBC)]

9. 其他开源项目与小总结

注意事项: 如果在搭建好项目之后,如果上传资源失败,那么有可能是ngixn限制上传文件大小(在server层设置client_max_body_size 200m),或者是php的解析器限制上传大小(/etc/php.ini)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ROeFqDN-1675611562894)(2764BAA95D2F4062A71427C06F2D8B4F)]

上图总结: 先发起http协议,先看发起的请求是静态的请求,还是动态的请求,如果是静态的请求,location / 直接就能匹配到,直接读取本地文件,直接返回了,如果是动态的请求nginx会通过fastcgi协议,交给后端的php,让php解析这个代码,解析完之后,传给nginx,nginx在返回给用户

其他的开源项目:
	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

小总结:

(1)我们在部署wordpresssde时候,都有安装引导,在公司里面的项目,不用使用这些向导,公司里面有这样的wp-config.php文件,不用自己去创建
(2) 上传的图片在web02上,文字在数据库中,所以web01访问不到图片,可以访问到文字,可以用nfs解决
(3)
在公司里统一代码有专门自动化的工具来实现的,就是在web站点一扔就是上线
手动上线( 后期的更新和回退不那么友好)
(4)大量的小文件拷贝非常慢,而且还占网络带宽。先打包,传过去在解包
打包非常消耗cpu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值