此为自己通过centos7系统搭建typecho博客的心得分享,全文目前6部分,这是第二节
点此参看下一节:
视频分享地址:
一、lnmp工作原理和安装准备
检查是否有添加了 FedoraProject 的 epel 源,
如果系统默认没有加入这个源,加入的方法很简单:
yum install epel-release
安装完成后执行
yum update
好了,正式开始:
一般来说,我们可以用编译安装,但是考虑到时间关系和本心得特点
手动通过官方和大型社区源epel规范化安装,不使用一键脚本
同时又不追求极致编译每个参数都亲力亲为,所以所有lnmp模块都采用配置好的源码直接部署
如果用编译安装,一般需要30分钟左右时间,
为了防止掉线,一般推荐安装screen进行分屏操作,这样即使
ssh掉线,还可以恢复正在进行的编译工作,免得做无用功,这里
稍微演示一下screen的安装
刚才已经安装好了epel源,我们继续,直接yum就可以安装screen了
yum -y install screen
复杂的暂时不用管,4个常用操作熟练即可
screen -ls
显示所有创建的桌面,未连接的桌面都显示Detachedscreen -r
+桌面ID或者完整桌面名字 即可进入之前创建的对应ID桌面,
再 screen -ls
就可以显示attached连接中了
在桌面链接中想退出当前桌面?按住 Ctrl +a+d
即按着ctrl不放,
再依次按一下a和d,就可以退出当前桌面了ctrl+c
linux通用代码,停止当前运行的指令
screen操作就这么简单
这些附带配置做好之后,我们创建一个screen
开始一键包安装lnmp环境了
screen -S lnmp
我们取一个容易记的别称,开一个叫lnmp的screen窗口开始安装lnmp,
你可以按照自己喜好命名,记得是用 -S大写的
这时候xshell窗口会出现一个screen 0标识
这时候,自己就可以选择一个军哥一键啊之类的脚本运行,Ctrl +a+d
关闭当前screen,喝杯咖啡或者下午茶,等待半小时后screen -r lnmp
回到咱们的工作分屏,收收菜,查看结果
这里就不多说了,我们今天采用
直接添加官方源后通过 yum 方式安装nginx。
二、配置repo源官方nginx
添加nginx源文件配置 touch /etc/yum.repos.d/nginx.repo
,编辑添加以下内容
vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
(以上适用于 CentOS 7, 其他版本可以看官网说明)
https://nginx.org/en/linux
yum list |grep nginx
查询下配置源是否成功
然后安装 nginx执行:
yum -y install nginx
如果操作正确到这里 nginx 环境就已经安装 OK 了。
当然你还可以使用命令查一下究竟是否安装完成。
rpm -q nginx
rpm是软件管理包工具-q
是query 英 [ˈkwɪəri]
查询对应名字的软件是否安装-qa
就是列出所有已安装软件包
yum install nginx
systemctl start nginx
systemctl enable nginx
将nginx加入自启动
systemctl status nginx
查看下运行状态
free -m查看下内存占用39m
这时候你的web服务就上线了,打开浏览器输入ip
103.79.76.41
即可看到nginx欢迎页面
关于nginx的一些查询,如果版本更新,怎么找到你的nginx conf位置,
当然去一键包或者官网的readme文档慢慢看也是很好的,
自己记住下面这个查询指令,更加主动:
ps -ef | grep nginx
e
指显示所有进程f
指全格式ps-ef
显示出的结果:
1.UID --- 用户ID
2.PID ----进程ID
3.PPID ----父进程ID
4.C ------- CPU占用率
5.STIME-----开始时间
6.TTY ------- 开始此进程的TTY----终端设备
7.TIME ------ 此进程运行的总时间
8.CMD---------命令名
ps指进程显示
grep
是查找工具,正则表达式方式搜索文本,打印出匹配结果
|指管道,grep
对管道提供的内容进行查询,筛选出nginx的行
然后就可以 vi
编辑了
三、安装 Mysql(MariaDB)
oracle美[ˈɔ:rəkl]甲骨文公司收购了mysql,mysql之父再次开发mariaDB作为开源产品替代,
以防mysql今后闭源,mariaDB是完全兼容mysql数据格式的,并且查询效率更高,
CentOS7 官方源中把 mysql 换成了 MariaDB,
因此我们这里以 MariaDB 代替 Mysql,首先执行安装:
yum install mariadb-server
安装完成后启动 MariaDB 并设置为开机启动:
systemctl start mariadb
systemctl enable mariadb
查看下内存占用
`free -m 130m
还是比较占资源的。内存小的vps(256m那种),推荐使用sqlite更轻量化
执行脚本通过交互的方式对 MariaDB 进行一些设置:
/usr/bin/mysql_secure_installation
默认root用户访问第一次是留空密码,
提示是否设置密码,当然设置一个了,弄个复杂点的,自己小本本记录好,
root用户禁止远程访问,我们在后面将设置新的专用远程访问账号就好,
还有开放相关firewalld端口设置,防止3306之类的端口无法访问。
四、安装php和相关扩展
先 yum search php
查询下有哪些可用php扩展
使用 yum 同样方便的安装 php-fpm,这里同时安装 php-mysql 扩展用于连接 mysql 数据库,如果你的 php 应用中需要用到更多的扩展,也可以在这里一并安装
附带安装一些必要的扩展
yum -y install php php-fpm php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel
以上就附带安装 PHP(php-fpm) 了
简单点,只安装下面2个也行:
yum install php-fpm php-mysql
2019.9.26更新:
如果要安装php7.0以上版本:
- 安装源
安装php72w,是需要配置额外的yum源地址的,否则会报错不能找到相关软件包。
php高版本的yum源地址,有两部分,其中一部分是epel-release,另外一部分来自webtatic。如果跳过epel-release的话,安装webtatic的时候,会有错误爆出。
所以,这里需要的命令是:
rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
当然,您也可以选择下面的这个命令,也是一样的效果。
yum install epel-release -y
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
- 清除历史版本
为了防止CentOS上面发生php冲突,所以,这个命令还是先执行一下更好些。
yum -y remove php*
- 安装扩展包
事实上,这里面的对应扩展库很多,这里大家一定要注意cli和fpm这两个包,而其它的相关包就看您需要了。
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel
还有比较豪华的版本:
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml
- 安装完成以后,启动服务
systemctl enable php-fpm.service
systemctl start php-fpm.service
2020.11.18更新:
如果使用centos8系统 要安装php7.0以上版本,推荐使用dnf包管理器来替换rpm,我们添加remi源:
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
查看最新包含的php模块,没错,现在使用模块管理包了
dnf module list php
可以看到包括php7.0-8.0一些版本选择,这里安装7.4
dnf module enable php:remi-7.4
我们安装普通套件+自选的一些模块,mysqlnd是必须的,当然,你也可以选择自己需要的组合,或者默认的开发套件和最小化安装
dnf install php php-cli php-common php-devel php-embedded php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-xml
最后启动服务,添加开机自启:
systemctl enable php-fpm.service
systemctl start php-fpm.service
php-fpm的由来,nginx和php通信2种模式比较,参考:
https://blog.csdn.net/QFire/article/details/78680717?locationNum=1&fps=1
这里简单说明一下
mod_php和mod_fastcgi两种通信模式沟通apache/nginx web服务端和php解析
php-fmp则是后来搭建的用来辅助mod_fastcgi通信的高效模式。
有兴趣的自己可以看看链接里有关于两者的详细历史发展,或者围观我的博客有文本教程
五、一些参数配置调整和测试
编辑下php配置
vi /etc/php.ini
修改
你在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/”
然后输入你要查找的关键字敲回车就可以了。
如果你要继续查找此关键字,敲字符 n 就可以继续查找了。
敲字符N(大写N)就会向前查询;
cgi.fix_pathinfo=0
举例来说,开启的危害就是假设你的网站有http://xx.com/a.jpg这样的一张图片,
我通过http://xx.com/a.jpg/foo.php就可以查看到这个文件的二进制内容,
意思就是可以通过php来执行它.问题就来了,如果你的网站允许用户上传图片,
那么用户就可以构造一些恶意的代码,并伪装成图片上传.
然后通过上面说的那种方式就可以在你网站的服务器上面通过php跑恶意代码了.
为了方便后面修改上传附件大小,提前修改下相关配置:
upload_max_filesize = 8000M;
post_max_size = 8000M;
max_execution_time=600;
修改php-fpm配置
vi /etc/php-fpm.d/www.conf
先展示下需要修改的列表清单:
listen= /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
user = nginx
group = nginx
pm = dynamic ;生成进程
pm.max_children = 50 可以启动多少进程
pm.start_servers = 10 一开始启动多少进程
pm.min_spare_servers = 5 最少启动的进程数
pm.max_spare_servers = 25 最多启动的进程数
pm.max_requests = 500 到达多少请求后自动结束进程
rlimit_files = 1024 一次请求的最大字节数
具体修改过程和理由,下面一个个解释
监听 php-fpm.sock
并发进程数设置假设一个进程20m内存占用,参考上面的php-fpm由来,
对于咱的768M辣鸡小鸡鸡,考虑存余内存大概768-300=468m的样子,
最多开25个进程差不多了,有swap缓存,凑合吧,不能再多了
systemctl start php-fpm.service
只有启动后/var/run/php-fpm/php-fpm.sock这个才会生成,而且停止后会自动释放。
systemctl enable php-fpm
最后将php-fpm服务挂载自动启动
重启下nginx
systemctl restart nginx
重启下php-fpm
systemctl restart php-fpm
看看端口:
netstat -pltn
一样的意思
p指program相关程序显示出来
l指listening,正在监听的端口才显示
t指tcp,只显示tcp端口
n指numeric 只显示numerical adress 不显示别名。
有80端口了
再看看咱们的php-fpm还在不在
ls /var/run/php-fpm/
php-fpm.sock正常运行
修改nginx 配置,将listen 127.0.0.0 :9000 端口通信方式也改成fastcgi socket模式
通过查询默认模板,找到咱们站点存放位置
find / -name default.conf
cat /etc/nginx/conf.d/default.conf
通过root项发现默认网站目录是在:
/usr/share/nginx/html下
cd过去,咱们创一个测试页面看看:
touch test.php
vi test.php
输入:
<?php
echo "Welcome to Steamoe";
phpinfo();
?>
保存
103.79.76.41/test.php
浏览器打开看看
这个页面还无法编译显示
显然我们的php还未和nginx通信成功,那么继续
编辑下nginx默认配置,测试下vi /etc/nginx/conf.d/default.conf
index项 加入一个index.php (可选内容,不在default.conf做首页index.php配置的话可以不加):
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;//如果需要,将index.php加入此处;
}
然后server{}项内填写之前cat获得的默认配置root路径
server {
listen 80 default_server;
server_name localhost;
root /usr/share/nginx/html;
//此root路径可能随版本发生改变或者不存在,自行添加修改。
}
server_name也可以填自己vps ip
新加入下面的location:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi_params;
}
因为fastcgi_params配置文件中的SCRIPT_FILENAME问题,使用源码安装的nginx,
fastcgi_params配置文件中是没有SCRIPT_FILENAME这个参数的,需要在server中自己填写,
试着打开103.79.76.41/test.php
发现No input file specified.
nginx维护日志查询:
find / -name error.log
cat /var/log/nginx/error.log
FastCGI sent in stderr: "Unable to open primary script:
/etc/nginx/html/test.php (No such file or directory)" while reading response header from upstream
发现要使用fastcgi 和php-fpm传输,这边没有文件信息传递过去,看看咱们的
fastcgi_params数组里面配置是否完整
vi /etc/nginx/fastcgi_params
加入
fastcgi_param SCRIPT_FILENAME $request_filename;
保存
systemctl restart nginx
systemctl restart php-fpm
再次打开
103.79.76.41/test.php
发现咱们的nginx测试网页已经可以和php正常通信了。
要使用上面的php-fpm传输配置,则必须保证fastcgi_params文件中包含下面的配置:
fastcgi_param SCRIPT_FILENAME $request_filename;
否则fastcgi无法找到要执行的脚本文件。
作者:dothetrick
链接:https://www.jianshu.com/p/1abf14f8c1d4
点此参看下一节:
11 comments
我在default.conf里加入了root /usr/share/nginx/html;但是不知道为什么nginx一直把/etc/nginx/html/当根目录,错误日志里是"/etc/nginx/html/index.html" is not found (2: No such file or directory)。我看了default.conf里所有地方的root都是 /usr/share/nginx/html,而就算把default.conf的改动全部还原也还是会出问题,不知道是哪里的原因……
版本不同,建议查看默认路径,不用强行改成教程里一样的,另外root路径是查看location /{}这个区域里的,不是在外面。或者直接删除掉default.conf也是个选择。
博主:你好!我跟着你的视频做,就一直卡在test.php是下载提示,和你视频一样。最后改了default.conf,会报错。不改就是下载页面。苦恼
别心急,按顺序来:
1.cat /etc/nginx/conf.d/default.conf发现root路径在/usr/share/nginx/html下,如果版本更新,你的default.conf默认server项不带root路径,你得加上对应root路径root /usr/share/nginx/html;此句代码于server{}内;
2.新加入的区域:
location ~ \.php$ {}
,里面关键一句参数我简单解释下:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
用来组合你刚才添加的root路径$document_root
和你的php脚本文档$fastcgi_script_name
,获得完整文件路径信息;3.nginx这边搞定路径配置了,再去fastcgi配置vi /etc/nginx/fastcgi_params加入
fastcgi_param SCRIPT_FILENAME $request_filename;
开启请求文件名参数,使得刚才在nginx配置文件default.conf里的$fastcgi_script_name
参数能正确表达,解析获得我们的test.php文件了。4.文章是初学研究时做的记录,我更新了下排版,添加了点注意提示,你再看看是否明朗一些:)
5.这些摸索测试弄明白了就行,实际搭建过程参看:
Centos 7 全新安装lnmp精简流程
精简过程,节省时间,思路更清晰,去掉无用的ftp搭建和各种测试环节,增加密钥登录访问安全性等操作
博主:好:
我的default.conf如下:
fastcgi_params文件:
error.log:
网页错误提示:
An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
If you are the system administrator of this resource then you should check the error log for details.
Faithfully yours, nginx.
可爱大佬,你怎么看?
按错误提示,检测文件是否存在,添加上favicon.ico和test.php(很不明白,明明在xshell新建了test.php。用xftp连接找不到)。之后错误提示改变,变成unix:/var/run/php-fpm/php-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 115.231.144.26, server: localhost, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "144.34.210.120"
楼主,报喜啊!用xftp找到/var/run/php-fpm/php-fpm.sock failed,右键有更改权限。其中有三个权限属性,分别是:所有者、组和其他。所有者和组的权限默认打勾,但是其他没有打勾选中。选中其他权限后,就能访问到这个文件。
恭喜,找到方法就好,多用
ls -al
查看文件属性,chown -R 修改所属,一般来说你修改完毕user = nginx
和group = nginx
后,php-fpm.sock是属于 nginx创建和访问的,安全方面来说是不需要勾选others访问权限的。root用户创建的test.php是普通文件,应该不会找不到,你可以多熟悉下,有的小疏忽很可能是自己自然而然手误,整个流程多来几遍,熟练之后很多小问题自己就会解决的更快了。www.conf配置user = nginx这些语句前的注释记得删掉,重启服务才会生效,我个人感觉你这是nginx配置还是默认的用户组,导致你的sock文件无法正确访问,给sock文件777权限终归没什么必要,不过先能正常用就好受大佬指点了。取消掉其他用户权限了。
权限问题是因为:
listen= /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
user = nginx
group = nginx
部分注销没有取消。现在正常了。
fastcgi_params文件加入了fastcgi_param SCRIPT_FILENAME $request_filename;可是还是报错了[error] 22228#22228: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory) 大神求教
其实新版本的php无需加入这条参数的,不过你这报错和加不加参数无关,是你的配置文件或者主题设计读取网站图标文件路径了,自己做个图标文件放到你的配置文档写的路径,如果是配置文件里的,则在/usr/share/nginx/html/,如果是你主题的设置,比如你的网站放在/home/www/xxx.com,那么你的ico文件放入:/home/www/xxx.com/usr/share/nginx/html/里,或者把配置文件里图标路径删了也行,我的ico是放在网站的根目录下,所以你打开https://omo.moe/favicon.ico 这个就是ico位置,对应我的文件目录是/home/wwwroot/omo.moe/favicon.ico, 供你参考看看吧