文章目录
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的一个管理进程
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
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测试
解释一下原理:
- 当输入域名的时候,浏览器自动加上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
(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文件中配置域名解析,然后打开网页,填写信息
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
9. 其他开源项目与小总结
注意事项: 如果在搭建好项目之后,如果上传资源失败,那么有可能是ngixn限制上传文件大小(在server层设置client_max_body_size 200m),或者是php的解析器限制上传大小(/etc/php.ini)
上图总结: 先发起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