一、Ngx处理用户请求
1、案例与思考
案例01: 思考之前搭建的cxk.cn网站,使用域名访问或ip访问都是没有问题的.如果把配置文件名game.cxk.cn.conf使用域名或ip访问或怎么样?
结果
- 域名访问网站没有任何问题
- 使用ip访问则显示静态页面,另外一个网站了.
原因
IP访问:选择默认server文件
选择server默认,端口后加 default_server
server {
listen 80 default_server;
2、处理用户请求流程
1、DNS解析:域名->IP地址
2、连接80端口:tcp3次握手与网站的80端口建立连接
3、http请求豹纹:请求方法,URI,HOST等信息!
- GET /index.html
- H0ST: cxk.cn
- User-Agent:Chrome/xxx
4、ngx处理
- http请求,http区域处理
-
不同的server{}区域(子配置文件)处理
- 端口
- 域名:用户请求的域名与子配置文件server_name进行匹配
- 匹配成功,就让对应的子配置文件(server{})处理
- 根据了配置文件的,root,location规则,index进行处理查找文件把找到的文件发回给用户
5、http响应报文:
- 状态码:200 ok
- server信息
- 其他信息
- 文件内容
6、客户收到文件内容,浏览器解析,进行展示
二、虚拟主机
1、概述与分类
虚拟机的分类 | 说明 | 应用场景 |
---|---|---|
基于域名的虚拟主机 | 不同域名访问不同的站点 | 生产环境最常用的 |
基于端口的虚拟主机 | 不同端口访问不同的站点 | 保护,设置特殊端口.1024以上 8888 18888 |
基于ip的虚拟主机 | 不同ip访问不同的站点. | 保护,用户只能通过某个ip连接进来. 用来限制网站只能通过指定的ip进行访问内网ip,vpn ip. |
2、基于域名的虚拟主机
不同域名访问不同的主机.
案例02: 创建test.cn网站 站点目录/app/code/test/ 书写配置文件.
1.完成后不创建站点目录进行访问看看报什么错误.
2.创建站点目录后再访问看看报什么错误.
3.创建首页文件和内容,访问看看显示什么.
书写配置文件
[root@nanjing conf.d]# cat test.conf
server{
listen 80;
server_name test.cn;
root /app/code/test;
location / {
index index.html;
}
}
加载配置文件systemctl reload nginx
测试问题1:
完成后不创建站点目录进行访问看看报什么错误. 404
[root@nanjing conf.d]# curl -v -H Host:test.cn http://43.137.51.152/index.html
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.25.4</center>
</body>
</html>
本地测试域名的小技巧(linux):节省修改本地Hosts
curl -v -H "Host: cxk.test.cn" http: 10.0.0.7/index.html
-H 修改请求头里面的内容.
测试问题2:
创建站点目录后再访问看看报什么错误.
403无首页文件,通常也表示权限拒绝!!!
测试问题3:
测试创建首页文件后访问。正常内容
3、基于端口的虚拟主机
不同的端口访问不的网站.
server{
listen 81;
server_name live.test.cn;
root /app/code/live;
location / {
index index.html;
}
}
浏览器
http://10.0.0.7:81/index.html
4、基于ip的虚拟主机
搭建mimi网站,端口是8888,只能通过172.16.1.7内网访问
server{
listen 172.16.1.7:8888;
server_name mimi.cn;
root /app/code/mimi;
location / {
index index.html;
}
}
浏览器
http://10.0.0.7:81/index.html
三、Ngx日志
1、概述
日志 | 使用建议 | 定义 | 使用 |
---|---|---|---|
错误日志 | 发生故障的时候可以查看,4xx,5xx | 通过错误级别指定 | error_log |
访问日志 | 记录用户什么时候访问,网站哪些页面,客户端信息 | 通过Log_format定义访问日志的格式 | access_log |
2、错误日志
error_log |
---|
格式:error_log 文件名 错误日志级别; |
指令放在哪:main,http,mail,stream,server,location |
错误日志级别;:左到右,越来越粗糙. 记录信息的详细程度.
debug, info, notice, warn, error, crit, alert, oremerg.
error
notice
debug: 未来用于调试使用,短时间开启,网站访问量特别大不开
生产建议
案例03:给每个虚拟主机指定自己独立的错误日志
在/etc/nginx/nginx.conf中注释#error_log /var/log/nginx/error.log notice;
[root@nanjing conf.d]# cat cxk.conf
server{
listen 80;
server_name cxk.cn;
error_log /etc/nginx/conf.d/cxk.cn.log notice;
root /app/code/cxk;
location / {
index index.html;
}
}
3、访问日志
辅助我们进行分析,网站访问量,ip,pv.
log_format 指定访问日志的格式 |
---|
log_format 格式名称 格式.....; |
放在那里:http |
Ngx访问日志格式(ngx内置变量) | 说明 |
---|---|
$remote_addr | 客户端IP |
$remote_user | 用户名(空,进行认证用户) |
$remote_local | 时间 30/Aug/2022:14:44:27 +0800 |
$requst | 请求报文的起始行(请求方法 URI HTTP/1.1) |
$status | http状态码 |
$body_bytes_sent | 响应给客户的文件的大小,响应报文的主体大小(文件大小) 单位字节 |
$http_referer | 从哪里跳转,访问到这个网站的. 网站运营分析 |
$http_usr_agent | 客户端代理(浏览器) |
$http_x_forwarded _for | XFF头,负载中使用,记录用户真实的ip地址. |
在/etc/nginx/nginx.conf中注释# access_log /var/log/nginx/access.log main;
[root@nanjing conf.d]# cat cxk.conf
server{
listen 80;
server_name cxk.cn;
error_log /etc/nginx/conf.d/cxk.cn.error.log notice;
access_log /etc/nginx/conf.d/cxk.cn.access.log main;
root /app/code/cxk;
location / {
index index.html;
}
}
访问日志其他选项access_log(了解,未来根据需要进行配置)
access_log | 说明 |
---|---|
访问日志进行压缩 | gzip需要通过zcat/zless/zgrep查看 |
进行缓存 | buffer32k 先把日志写入到内存中,定期写入到磁盘 |
定义刷新时间 | flush=10s |
access_log /var/log/nginx/cxk.cn.access.log main gzip buffer=32k flush=10s;
四、location规则
URL处去域名就是URI
location匹配uri
1、项目一:限制访问管理页面
域名:buy.com
站点目录:/app/code/buy/
后台管理页面:/app/code/buy/admin/index.html
要求后台限制网段访问:43.137.51.0/24网段.
1、编辑配置文件
[root@nanjing conf.d]# cat buy.com.conf
server{
listen 80;
server_name buy.com;
root /app/code/buy;
location / {
index index.html;
}
#buy.com/admin
#uri:/admin/
location /admin/{
#允许43.137.51.0/24网段访问
allow 43.137.51.0/24;
#拒绝所有
deny all;
}
}
2、创建目录文件and刷新配置文件
[root@nanjing conf.d]# mkdir -p /app/code/buy/admin
[root@nanjing conf.d]# echo "give me buy buy" > /app/code/buy/index.html
[root@nanjing conf.d]# echo "store manage" > /app/code/buy/admin/index.html
[root@nanjing conf.d]# nginx -t
[root@nanjing conf.d]# systemctl reload nginx
3、测试
[root@nanjing conf.d]# curl -H Host:buy.com http://43.137.51.152:80
give me buy buy
[root@nanjing conf.d]# curl -H Host:buy.com http://43.137.51.152:80/admin/index.html
store manage
其他主机
2、项目二:配置缓存expires
浏览器访问网站的缓存信息
server{
listen 80;
server_name buy.com;
root /app/code/buy;
location / {
index index.html;
}
#uri包含 .html或.js或.css 缓存1天
location ~* .(html|js|css)$ {
expires max;
#expires 1d;
}
#uri包含 .jpg 或 .jpeg 或 .png 或 .gif 或 .bmp
location ~* .(jpg|jpeg|png|gif|bmp)$ {
expires 1h;
}
}
3、location规则小结
五、一个高清视频下载站
1、自动索引功能(列表站点目录的内容),首页文件不存在.
autoindex模块 | |
---|---|
autindex on; | 开启目录索引功能(显示站点目录下的文件的列表,首页文件不存在.) |
autoindex_localtime on; | 显示本地时间 |
autoindex_exact_size off; | 是否显示精确的文件的大小。off表示以人类可读形式显示大小 |
server{
listen 80;
server_name videoshishu.com;
root /app/code/video;
error_log /etc/nginx/conf.d/vide.com/error.log notice;
access_log /etc/nginx/conf.d/vide.com/access.log main;
charset utf8;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
location /{
index index.html;
}
}
2、增加一个svip目录,里面创建文件.
增加认证功能(用户名和密码).
auth_basic模块
auth_basic "请输入密码:";
auth_basic_user_file conf/htpasswd; #指定用户名,密码文件
yum install -y httpd-tools
#创建文件
htpasswd -bc /etc/nginx/user shishu 1
#增加用户
htpasswd -b /etc/nginx/user wu 1
#修改权限
chmod 600 /etc/nginx/user
chown nginx.nginx /etc/ngi
location /svip/ {
auth_basic "input password:";
auth_basic_user_file /etc/nginx/user;
}
3、增加统计功能
stub_status模块/指令,显示nginx服务的状态,用户访问的状态
location /status {
stub_status;
}
ngx状态模块中的指标说明 | 说明 | 说明 |
---|---|---|
Active connections | 当前已经建立的连接数(est)和等待数量 | 体验:ngx并发 |
server accepts | 已经接收到客户端的连接总数 | |
handled | 服务端已经处理的连接. | |
requests | 客户端发出请求的总数 | |
reading | 正在读取的请求头连接数量 | |
writing | 正在进行的响应的连接数量 | |
waiting | 排队数量 | 排队情况. |
ab 压力测试功能
ab -n 9999999 -c 3 -H Host:videoshishu.com http://10.0.0.7/
4、模块小结
模块 | 核心指令 |
---|---|
目录索引模块 | autoindex on; |
认证功能模块 | auth_basic_user_file /etc/nginx/user; |
访问控制模块 | allow和deny |
状态模块 | 用于监控ngx连接情况,stub_status; |
ngx核心模块 | Root,location,error_log,server_name,listen |
ngx日志模块 | Access_log,log_format |
官方文档:指南大全
六、动态网站架构-wordpress
开发书写了一个php代码发给我们部署下。
1.测试能否直接部署到nginx中?
2.需要什么服务,是什么原理?
3.准备服务并测试。
4.部署代码。
1、概述
网络架构 | 说明与特点 | 性能 | 说明 |
---|---|---|---|
静态网站 | 网站仅仅包含:html,css样式,js脚本,图片,视频 ngx直接次处理的资源静态资源 | 只需要web服务器即可:nginx,可以承受较高的访问量, 不支持动态的功能,注册,评论,静态网站功能单一 | 浏览器端解析(客户端解析),服务端仅仅负责发送, |
动态网站 | 动态网站一般是通过开发语言实现 :java,php,python,Golang ... | 动态资源页面需要,服务器进行处理nginx+php/tomcat..+数据库处理后把结果返回给用户, | 动态请求需要服务端进行处理与解析,把结果给用户, |
2、常见动态网站的架构
PHP:LNMP(LEMP), LAMP, WNMP/WAMP (P PHP,W Windows,A Apache)
Java:LNMT(Tomcat,Jetty,Weblogic,Jboss)
Python:LNMP(Python,uwsgi)
Golang: LNMG(Golang)
C/C :LNM?........
Linux 系统
Nginx Web服务
MySQL/MariaDB 数据库
3、LNMP架构细节
LNMP处理动态请求流程概述
1)数据库
执行以下命令,查看系统中是否已安装 MariaDB。
rpm -qa | grep -i mariadb
则表示已存在 MariaDB,为避免安装版本不同造成冲突,请执行以下命令移除已安装的 MariaDB。
yum -y remove 包名
执行以下命令,在 /etc/yum.repos.d/
下创建 MariaDB.repo
文件。
vim /etc/yum.repos.d/MariaDB.repo
编辑 MariaDB.repo
文件
# MariaDB 10.4 CentOS repository list - created 2019-11-05 11:56 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = https://mirrors.cloud.tencent.com/mariadb/yum/10.4/centos7-amd64
gpgkey=https://mirrors.cloud.tencent.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
安装调试
yum install -y mariadb-server
#mariadb-server 服务端
#mariadb 客户端
systemctl enable mariadb
systemctl start mariadb
#检查
ss -lntup |grep mysql
ps -ef |grep mysql
#仅仅刚安装的时候运行.仅首次 运行即可.
mysql_secure_installation
#用于设置root密码,清理用户和清理临时库.Y
报错指南:解决方案
Linux系统的root与数据库的root
1、2个独立的用户.
2、Linux的root用户用于进入和管理整个Linux系统.
3、数据库的root用户仅仅用于管理MySQL数据库.
mysql -uroot -p1
查看系统所有的数据库.(熟练)
show databases;
查看库里的表(了解)
show tables from mysql;
显示mysql库的user表的user列和host列 (列 •字段),查看数据库的用户信息. (熟练)
select 字段1,字段2 from 库.表;
select user,host from mysql.user;
创建数据库(熟练)
create database shishu;
创建用户(会用,会改) 未来通过用户管理数据库.
#创建用户,进行授权
grant all on shishu.* to 'shishu'@'43.137.51.%' identified by '1';
grant 所有权限 on 数据库.* to '用户名'@'白名单'
#内网主机访问
[root@backup ~]# mysql -ushishu -p1 -h 10.0.0.12
数据库白名单说明: 白名单表示用户可以从哪里进行登录与使用数据库.
一般localhost表示只能在数据库本地使用.
可以通过172.16.1.% 进行授权局域网访问. 其他局域网机器可以访问数据库.
只给个%表示所有人可以访问(不安全). %不包含localhost.
删除数据库
drop database lidao;
删除用户
drop user 'lidao'@'172.16.1.%' ;
drop user 'lidao'@'localhost' ;
2)PHP
依次执行以下命令,更新 yum 中 PHP 的软件源。
rpm -Uvh https://mirrors.cloud.tencent.com/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
执行以下命令,安装 PHP 7.2 所需要的包。
yum -y install mod_php72w.x86_64 php72w-cli.x86_64 php72w-common.x86_64 php72w-mysqlnd php72w-fpm.x86_64
执行以下命令,启动 PHP-FPM 服务。设置 PHP-FPM 服务为开机自启动。
systemctl start php-fpm
systemctl enable php-fpm
查看端口和进程
[root@web01 ~]# ss -lntup |grep php
[root@web01 ~]# ps -ef |grep php
apache 9222 php-fpm: pool www
apache 9223 php-fpm: pool www
apache 9224 php-fpm: pool www
apache 9225 php-fpm: pool www
apache 9226 php-fpm: pool www
统一nginx与php用户,需要修改php配置文件
[root@nfs01 php-fpm.d]# egrep -n '^user|^group' /etc/php-fpm.d/www.conf
8:user = nginx
10:group = nginx
3)nginx
1、执行以下命令,在 /etc/yum.repos.d/
下创建 nginx.repo
文件。
vi /etc/yum.repos.d/nginx.repo
2、按 i 切换至编辑模式,写入以下内容。
[nginx]
name = nginx repo
baseurl = https://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck = 0
enabled = 1
3、按 Esc,输入 :wq,保存文件并返回。
4、 执行以下命令,安装 nginx。
yum install -y nginx
5、执行以下命令,打开并编辑 default.conf
文件。
server{
listen 80;
server_name blog.shishuwu.com;
root /app/code/blog;
location / {
index index.php;
}
location ~.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
6、赋予权限,重新加载
[root@nfs01 conf.d]# chown -R nginx.nginx /app/code/blog
[root@nfs01 conf.d]# systemctl reload nginx
unzip wordpress-6.1.1.zip
mv wordpress/* /app/code/blog/
4)网站配置
访问网站