1.web服务nginx指令补充
1.1日志
错误日志(error_log)
访问日志(access_log)
1)错误日志
error_log指令 说明 语法格式: error_log file [level ]; 默认: error_log logs/error.log error; 上下文(放在哪个区域): main, http, mail, stream, server, location
debug, info, notice, warn, error, crit, alert, 或 emerg
最详细 > > > > > > 最粗略
一般使用notice,调试测试的时候可以选用debug,线上生产环境禁用DEBUG级别
2)访问日志
log_format 定义访问日志的格式
access_log 类似于error_log指定日志的位置和格式
access_log指令 说明 语法格式: access_log path [format [buffer=size ] [gzip[=level ]] [flush=time ] [if=condition ]];access_log off; 默认: access_log logs/access.log combined; 上下文(放在哪个区域): http, server, location, if in location, limit_except
log_format指令 说明 语法格式: log_format name [escape=default|json|none] string …; 默认: log_format combined “…”; 上下文(放在哪个区域): http
1.2 location规则
location针对请求的URI进行判断和过滤
ngx中的if结合各种ngx变量实现判断
location只负责匹配请求路径,不关心文件是否存在。404 错误是在文件查找阶段产生的,不是location 匹配阶段。每个请求只会进入一个location,一旦找到匹配就立即停止搜索。
#报这些错误,指定50x.html错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#站点目录(/)
root /usr/share/nginx/html;
}
1)案例1-改造小鸟飞飞站点
①目标
给小鸟飞飞网站添加一个/admin/功能(页面).只能172.16.1.0/24访问
搭建bird小鸟飞飞网站,给网站加速,设置缓存,网站中js,css结尾的文件缓存1天,图片缓存1小时。(浏览器缓存–>F12)
指定错误404页面
②html,css,js前端三剑客
html,css,js 前端开发/静态资源—>只需要nginx就可以运行 浏览器解析
html 人(页面)
css 衣服(样式,排版)
js(JavaScript) 特效,皮肤(加简单的动态效果,eg:手机号身份证号是否合规的判断)
测试
把小鸟飞飞中的css,js压缩(不可用),看效果。测试完再解压缩恢复即可。
gzip:压缩
gzip -d:解压缩(-d decompress = 解压)
③缓存指令
缓存使用(浏览器缓存)
expires 1d;
expires 1h;
指令
2)小结
location / 与~与~* 与/路径/
expires指令设置浏览器缓存,ngx优化项目之一
error_page 指定错误页面
1.3 nginx处理用户请求流程
文字描述:
1.用户发出http请求(1个静态 资源)
首先做DNS解析(hosts解析),域名解析ip,与网站的80端口三次握手建立连接,发出http请求报文,到达网站的80端口,对应的是nginx服务,请求先到达ngx服务的主配置文件的http区域,会继续找include包含的子配置文件的server区域的80端口的站点(主配置文件也可能有serve区域),根据请求报文中的host与站点中的serve_name做对比,如果对应上了,则对应的站点处理,看请求中的URI符合哪个location规则,若都不符合,则location /保底;若不是动态资源(.php结尾),ngx自己处理(站点目录+URI返回(响应报文)给用户.有,返回200状态码;没有,返回错误状态码),连接留一会(预判用户还会请求),之后4次挥手断开连接。
2.用户发出http请求(动态 请求)
…,通过80端口到达ngx的http区域,会继续找include包含的子配置文件的server区域的80端口的站点,根据请求报文中的host与站点中的serve_name做对比,如果对应上了,则对应的站点处理,看请求中的URI符合哪个location规则,(.php结尾,location在处理时,要(传球)把请求发送给本地的9000端口,发的时候带着变量(文件的绝对路径:站点目录+URI)),php收到这些信息(包括用户名,密码),读取绝对路径的php文件(和数据库的用户名,密码做对比),对比成功,返回301/302跳转状态码(登陆之前和登陆之后的页面不一样)的响应报文给ngx,ngx再返回给用户,用户收到登录成功提示并且进入登录之后的页面。
1.4 nginx默认站点处理
以上均是请求报文中的host与站点中的serve_name匹配上的情况。若匹配不上,或有人故意用你网站不存在的域名(他已提前做hosts解析)或ip访问,ip访问的话也不用做DNS解析了,与网站的80端口三次握手建立连接,发出http请求报文,通过80端口到达ngx的http区域,会继续找include包含的子配置文件的server区域的80端口的站点,根据请求报文中的host与站点中的serve_name做对比,若都匹配不上,看有没有默认站点处理(端口后含default_server指令),若有,则该站点处理;若没有,则子配置文件按字母排序,排在第一的站点处理(未来不确定谁在第一)。
host头可以改,所以host的信息不一定就是目标信息。
例如:curl -H Host:lidao.baidu.com www.baidu.com(现在host头就是lidao…,所以百度的ngx子配置文件中肯定没有,就会走默认的站点(固定输出一个错误页面等))
[root@web01 ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name _;
root /app/code/error;
charset utf8;
location / {
index 404.html;
}
# return 418;
}
2.动态网站架构
2.1动态?静态?
网站架构 特点 说明 动态资源 服务端处理与加工,设计动态语言php,java,python,golang.rust..(后台,后端) 一般需要数据库,服务端处理,结果给用户 静态资源 服务端发送,客户端解析(html,css,js)前端 客户端解析,服务端只负责发送,网站处理更快 混合用 静态(前端开发),动态(后端) 全栈开发(前+后)
之前的ngx部署小游戏:静态网站
动态网站架构如下:
常见动态网站架构 说明 lnmp(php代码) linux系统,nginx(web服务),mysql(数据库,postgresql),php环境(动态语言)—php代码就是php解释器(环境)运行的;java代码是tomcat(环境) lnmt linux系统,nginx(web服务),mysql(数据库,postgresql),tomcat(java) lnm? linux系统,nginx(web服务),mysql(数据库,postgresql),什么语言(python,golang..)
补充:l–>Linux系统 w–>windows系统 n–>nginx a–>apache
工作场景:
开发书写了一个php代码,java,Python,Golang 发给我们部署下。
1.测试能否直接部署到nginx中?
2.需要什么服务?是什么原理?
3.准备服务并测试
4.部署代码
2.2.项目01-lnmp环境部署在2台机器
1)环境准备(新的)
角色 主机与ip nginx+php web01 10.0.0.7/172.16.1.7 数据库(mariadb) db01 10.0.0.51/172.16.1.51
服务版本的选择:
ngx一般没有版本要求,稳定即可(ngx 1.26.xx)
php的版本要求,根据代码来定(https://wordpress.org/download/ )
Recommend PHP 8.3 or greater and MySQL version 8.0 or MariaDB version 10.6 or greater.
数据库: 用什么和什么版本也要根据代码要求,mariadb
部署wordpress
nginx 1.26.1
php 8.0
mariadb 10.3
2)数据库
yum install -y mariadb-server
# mariadb-server 服务端
# mariadb 客户端
systemctl enable mariadb
systemctl start mariadb
#检查
ss -lntup |grep mysql #3306端口
ps -ef |grep mysql
数据库安全配置(SQL语句实现,现在它通过mysqlSQL语句实现)
mysql_secure_installation #仅仅刚安装的时候运行.仅首次运行即可.
用于设置root密码,清理用户和清理临时库.
Enter current password for root (enter for none): 回车
Set root password? [Y/n] Y #设置密码(lidao)
New password: 输入密码
Re-enter new password: 再次输入
Password updated successfully!
Reloading privilege tables..
... Success!
Remove anonymous users? [Y/n] Y #删除数据库中的匿名用户(没有用户名的用户,容易导致安全问题)
Disallow root login remotely? [Y/n] Y #是否禁止root(数据库的root)远程登录
Remove test database and access to it? [Y/n] Y #是否删除test测试用的数据库
Reload privilege tables now? [Y/n] Y #是否更新权限信息表
Linux系统的root与数据库的root区别:
1️⃣2个独立的用户
2️⃣linux的root用户用于进入和管理整个linux系统
3️⃣数据库的root用户仅仅用于管理MySQL数据库
⑤小结
SQL语句
⭐查看:show,select 查看数据库,查看用户
⭐增加:创建数据库,创建用户
删除:删除用户,删除数据库
测试连接 mysql -u -p -h
3)web01安装php
#1.清理已有的php软件包
# systemctl stop php-fpm
# yum -y remove php*
#2.安装软件包
yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml php-json
#3.检查与开机自启动
[root@web01 ~]# rpm -qa|grep php|wc -l #检查软件包数量
15
[root@web01 ~]# rpm -ql php-fpm|grep systemd #检查服务名(systemctl管理)
/usr/lib/systemd/system/php-fpm.service
......
[root@web01 ~]# systemctl enable --now php-fpm
[root@web01 ~]# ps -ef|grep php-fpm #进程的用户名(需修改和nginx服务的虚拟用户一致)
root 20305 1 0 21:45 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
apache 20306 20305 0 21:45 ? 00:00:00 php-fpm: pool www
apache 20307 20305 0 21:45 ? 00:00:00 php-fpm: pool www
apache 20308 20305 0 21:45 ? 00:00:00 php-fpm: pool www
apache 20309 20305 0 21:45 ? 00:00:00 php-fpm: pool www
apache 20310 20305 0 21:45 ? 00:00:00 php-fpm: pool www
[root@web01 ~]# ss -lntup |grep php #查看无端口
#4.修改配置文件进程用户(apache-->nginx)
[root@web01 ~]# rpm -ql php-fpm
/etc/php-fpm.conf #主配置文件
/etc/php-fpm.d
/etc/php-fpm.d/www.conf #子配置文件(修改的目标)
....
[root@web01 ~]# grep -i 'include=' /etc/php-fpm.conf #检查子配置文件的位置
include=/etc/php-fpm.d/*.conf
[root@web01 ~]# egrep '^listen|^user|^group' /etc/php-fpm.d/www.conf
修改这3个为
user = apache #改为nginx
group = apache #改为nginx
listen = /run/php-fpm/www.sock #改为127.0.0.1:9000
....
#5.修改后检查
[root@web01 ~]# egrep -n '^(listen =|^user|^group)' /etc/php-fpm.d/www.conf
24:user = nginx
26:group = nginx
38:listen = 127.0.0.1:9000 #nginx访问9000端口(用户请求-->ngx,ngx把请求-->9000端口),nginx和php在一台机器上,效果等于localhost
#6.检查语法
php-fpm -t #看是否有successful
#7.重启服务或reload服务都行
systemctl reload php-fpm.service
①php配置小结
4)nginx配置
5)部署代码与设置权限
在Windows下的位置:E:\q群下载\web相关的游戏代码
#1.下载
rz上传或拖拽到家目录
#2解压之前先看一下(有没有多一层目录)
[root@web01 ~]# unzip -t wordpress-6.8.3-zh_CN.zip |grep index.php
testing: wordpress/wp-admin/index.php OK
testing: wordpress/wp-admin/user/index.php OK
testing: wordpress/wp-admin/network/index.php OK
testing: wordpress/index.php OK #多了一层
testing: wordpress/wp-content/plugins/index.php OK
testing: wordpress/wp-content/plugins/akismet/index.php OK
testing: wordpress/wp-content/themes/twentytwentytwo/index.php OK
testing: wordpress/wp-content/themes/index.php OK
testing: wordpress/wp-content/index.php OK
testing: wordpress/wp-includes/sitemaps/class-wp-sitemaps-index.php OK
testing: wordpress/wp-includes/blocks/index.php OK
#3.创建好站点目录
[root@web01 ~]# mkdir -p /app/code/blog
#4.解压到当前目录
[root@web01 ~]# unzip wordpress-6.8.3-zh_CN.zip
#5.把目录下的内容移动到站点目录(只要这个目录下内容,不要目录)
[root@web01 ~]# mv wordpress/* /app/code/blog/
#6.配置站点目录写权限(修改所有者,用户组)--ngx,php有动态语言之后会对此目录进行读写操作
chown -R nginx.nginx /app/code/blog/ #权限给的还有些大,未来再精简
#7.windows做hosts解析
写入sublime保存即可:10.0.0.7 blog.oldboy.cn
#8.浏览器输入blog.oldboy.cn域名访问即可
6)登录
安装WordPress后,成功,再查看blog数据库,自动创建好了以下表信息。
7)写文章测试
总结
动态网站架构lnmp的使用,部署wordpress博客(PHP代码写的)
错误日志,访问日志
访问日志的内容(分析)
location规则