Nginx-web系列
nginx 系列
一 简述
1.1 为什么要使用?
Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。
开源: 直接获取源代码
高性能: 支持海量并发
可靠: 服务稳定
轻量级 占用内存小
长期稳定
Nginx和apache区别
服务 | 模型 | 区别 | 特点 |
---|---|---|---|
Nginx | Epool 异步模型 | 处理用户请求时 优先放在缓存中 epool模型会直接进行处理 效率高 | 处理高并发时 性能很好 连接数无上限 复杂性中 |
Apache | Select 同步模型 | select模型就会进行一次遍历扫描,逐个执行,从而导致性能低下。 | 连接数高并发时 性能急剧下降 连接数 有限 |
1.2 主要用于哪里?
- nginx web服务
- 负载均衡服务
- nginx 缓存服务
二. Nginx 搭建环境
2.1 版本选择
开源软件选择: 选择活跃,资料多
版本选择: 最新稳定版本(stable),上一个最新稳定版, 最新的 lts 版本(长期
- 维护版本)
2.2 环境准备
服务器名称 | IP地址 | 软件 |
---|---|---|
web01 | 10.0.0.101 | nginx |
web02 | 10.0.0.102 | nginx |
2.2 yum 直装
#01 配置yum 源
nginx 源 http://nginx.org/en/linux_packages.html#RHEL-CentOS
[root@node02 yum.repos.d]# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
#02 安装即可
[root@node02 yum.repos.d]# yum install -y nginx
2.3 nginx 目录结构
#03 下载的配置文件清单
[root@aliyun ~]# rpm -ql nginx
/etc/nginx #主要配置文件目录
/etc/nginx/conf.d #分支配置文件 (主配置文件的一部分)
/etc/nginx/conf.d/default.conf #默认配置文件
/etc/nginx/fastcgi_params #nginx与fastcgi(php) 配合使用的文件
/etc/nginx/mime.types #媒体类型文件
/etc/nginx/modules #模块
/etc/nginx/nginx.conf #主配置文件
/etc/nginx/scgi_params #ngixn与scg配合使用的文件
/etc/nginx/uwsgi_params #nginx与uwsgi(python) 配合使用的文件
/usr/sbin/nginx #二进制文件 nginx命令
/usr/share/nginx/html #默认的站点目录(网站的根目录)
/var/cache/nginx #缓存 临时文件
/var/log/nginx #日志目录
/usr/lib/systemd/system/nginx.service #systemctl 服务管理文件
2.4 简单使用
- 启动服务
#开启服务并开机自启动
systemctl start nginx
systemctl enable nginx
#检查端口 默认监听的 80 端口
[root@web01 ~]# ss -lntup |grep nginx
ps -aux | grep nginx
#检查对应进程
[root@node02 yum.repos.d]# ps -ef | grep nginx
root 1974 1 0 21:27 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1975 1974 0 21:27 ? 00:00:00 nginx: worker process
nginx 1976 1974 0 21:27 ? 00:00:00 nginx: worker process
root 1987 1721 0 21:30 pts/1 00:00:00 grep --color=auto nginx
#检查版本
[root@node02 yum.repos.d]# nginx -v
nginx version: nginx/1.24.0
- 代码上线
#01 删除默认代码
[root@node02 yum.repos.d]# cd /usr/share/nginx/html
[root@node02 html]# rm -rf *
#02 下载代码到指定位置
[root@node02 html]# wget http://192.168.31.46/download/game/xiaoniaofeifei.zip
#03 解压代码并删除压缩包
[root@node02 html]# unzip xiaoniaofeifei.zip
Archive: xiaoniaofeifei.zip
inflating: sound1.mp3
creating: img/
inflating: img/bg1.jpg
inflating: img/bg2.jpg
inflating: img/number1.png
inflating: img/number2.png
inflating: img/s1.png
inflating: img/s2.png
inflating: 21.js
inflating: 2000.png
inflating: icon.png
inflating: index.html
#浏览器访问
http://10.0.0.101/game/
四 nginx 配置文件
4.1 主配置文件 nginx.conf
#主配置文件详解
[root@aliyun ~]# cat /etc/nginx/nginx.conf
user nginx; #nginx 运行进程的用户
worker_processes auto; #worker 进程的数量 处理用户请求(一般时cpu核心总数的2倍)
error_log /var/log/nginx/error.log notice; #错误日志error 位置 notice
pid /var/run/nginx.pid; #进程pid的位置
events { #events 模块/区域
worker_connections 1024; #每个worker进程最大的连接数(并发)
}
http { #http 模块/区域
include /etc/nginx/mime.types; #媒体类型(文件类型) include引用或者包含其它地方的配置 精简nginx主配置文件
default_type application/octet-stream; #默认的文件类型(媒体类型)
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #指定访问日志的格式
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; #访问日志 access_log 指定日志的位置和格式mail
sendfile on; #开启高效的传输模式
#tcp_nopush on;
keepalive_timeout 65; #keepalive 长连接超时时间(s)
#gzip on; #是否开启gzip压缩 静态文本内容(节省带宽资源)
include /etc/nginx/conf.d/*.conf; #引用conf.d/*.conf 结尾的文件
}
4.2 server 配置文件
#01 配置详解
[root@web01 nginx]$ cat /etc/nginx/conf.d/default.conf
server { #server 区域
listen 80; #监听端口
server_name localhost; #域名 www.zhangyuzhou.cn localhost 本地默认
access_log /var/log/nginx/host.access.log main; #给某一个server或者网站 配置日志
location / { #用来匹配uri 访问文件在系统那个文件 location/ 默认值
root /usr/share/nginx/html; #root指定网站站点目录(根目录)
index index.html index.htm; #index 指定网站的首页文件
}
error_page 500 502 503 504 /50x.html; #错误页面
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 主配置文件图示
- server图示
五. nginx 虚拟主机 server
5.1 定义
虚拟主机方式 | ||
---|---|---|
基于域名的虚拟主机 | 不同的域名访问不同的站点 | |
基于IP的虚拟主机 | 不同的ip地址可以访问不同的站点 | |
基于端口的虚拟主机 | 不同的端口可以访问不同的站点 | 用于隐藏重要路径或业务 |
#01 虚拟主机
虚拟主机:nginx配置中多个server{}区域,每个server{}对应不同的业务{站点}
5.2 基于域名虚拟主机
- 需求
- 开始配置
#要求 基于域名配置主机 要求访问不同域名返回对应的值
/code/www www.zhangyuzhou.com 返回内容 My domain name is www.zhangyuzhou.com
/code/game game.zhangyuzhou.com 返回内容 My domain name is game.zhangyuzhou.com
/code/live live.zhangyuzhou.com 返回内容 My domain name is live.zhangyuzhou.com
#01 备份原来的配置文件
[root@node02 conf.d]# mv default.conf default.conf.bak
#02 书写nginx 配置文件 配置server
[root@kq_mysql ~]# cd /etc/nginx/conf.d/
[root@kq_mysql conf.d]# cat www.conf
server {
listen 80;
server_name www.zhangyuzhou.com;
location / {
root /code/www;
index index.html index.htm;
}
}
[root@kq_mysql conf.d]# cat game.conf
server {
listen 80;
server_name game.zhangyuzhou.com;
location / {
root /code/game;
index index.html index.html;
}
}
[root@kq_mysql conf.d]# cat live.conf
server {
listen 80;
server_name live.zhangyuzhou.com;
location / {
root /code/live;
index index.html index.html;
}
}
#02 创建站点数据目录
mkdir -p /code/{game,www,live}
echo 'My domain name is www.zhangyuzhou.com' >/code/www/index.html
echo 'My domain name is game.zhangyuzhou.com' >/code/game/index.html
echo 'My domain name is live.zhangyuzhou.com' >/code/live/index.html
#03 检查语法并重载服务
[root@kq_mysql 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@kq_mysql conf.d]# nginx -s reload
#04 修改本地hosts文件 增加dns解析
vim /etc/hosts
10.0.0.101 www.zhangyuzhou.com game.zhangyuzhou.com live.zhangyuzhou.com
echo "10.0.0.101 www.zhangyuzhou.com game.zhangyuzhou.com live.zhangyuzhou.com" >>/etc/hosts
#05 本机测试
curl www.zhangyuzhou.com
curl game.zhangyuzhou.com
curl live.zhangyuzhou.com
[root@kq_mysql conf.d]# curl www.zhangyuzhou.com
My domain name is www.zhangyuzhou.com
[root@kq_mysql conf.d]# curl game.zhangyuzhou.com
My domain name is game.zhangyuzhou.com
[root@kq_mysql conf.d]# curl live.zhangyuzhou.com
My domain name is live.zhangyuzhou.com
- web页面访问 需要增加windeows hosts解析
#01 windows 路径
C:\Windows\System32\drivers\etc\hosts
添加下面内容
10.0.0.101 www.zhangyuzhou.com game.zhangyuzhou.com live.zhangyuzhou.com
#02 页面访问即可
www.zhangyuzhou.com
game.zhangyuzhou.com
live.zhangyuzhou.com
5.3 基于ip虚拟主机
- 添加IP
#02 增加 ip addr
1) 增加临时IP
[root@node02 conf.d]# ip addr add 10.0.0.112/24 dev ens32 label ens32:0
[root@node02 conf.d]# ip addr add 10.0.0.122/24 dev ens32 label ens32:1
2)删除IP
ip addr del 10.0.0.112/24 dev ens32 label ens32:0
ip addr del 10.0.0.122/24 dev ens32 label ens32:1
- 开始配置
#01 要求 基于ip 配置主机 要求访问不同ip 返回对应的值
/code/www 10.0.0.102 返回内容 My domain name is www.zhangyuzhou.com
/code/game 10.0.0.112 返回内容 My domain name is game.zhangyuzhou.com
/code/live 10.0.0.122 返回内容 My domain name is live.zhangyuzhou.com
#02 书写nginx 配置文件 配置server
[root@kq_mysql ~]# cd /etc/nginx/conf.d/
[root@node02 conf.d]# cat *.conf
server {
listen 80;
server_name 10.0.0.102;
location / {
root /code/www;
index index.html index.htm;
}
}
server {
listen 80;
server_name 10.0.0.112;
location / {
root /code/game;
index index.html index.htm;
}
}
server {
listen 80;
server_name 10.0.0.122;
location / {
root /code/live;
index index.html index.htm;
}
}
#03 检查语法并重载服务
[root@kq_mysql 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@kq_mysql conf.d]# nginx -s reload
#04 页面访问
curl 10.0.0.101
curl 10.0.0.121
curl 10.0.0.131
- Web 页面访问即可
5.3 基于端口虚拟主机
#01 要求 基于端口 配置主机 要求访问不同端口 返回对应的值
/code/www 80 返回内容 My domain name is 80
/code/game 81 返回内容 My domain name is 81
/code/live 82 返回内容 My domain name is 82
#02
[root@kq_mysql conf.d]# cat www.conf
server {
listen 80;
server_name 10.0.0.101;
location / {
root /code/www;
index index.html index.html;
}
}
[root@kq_mysql conf.d]# cat game.conf
server {
listen 81;
server_name 10.0.0.101;
location / {
root /code/game;
index index.html index.html;
}
}
[root@kq_mysql conf.d]# cat live.conf
server {
listen 82;
server_name 10.0.0.101;
location / {
root /code/live;
index index.html index.html;
}
}
#03 检查语法并重载服务
[root@kq_mysql 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@kq_mysql conf.d]# nginx -s reload
#04 访问测试
curl 10.0.0.101
curl 10.0.0.101:81
curl 10.0.0.101:82
- web 页面直接访问即可
六. nginx日志详解
6.1 定义
#01 默认位置
访问日志: /var/log/nginx/access.log
错误日志: /var/log/nginx/error.log
#02 定义
访问日志的格式: log_format 设置 nginx访问日志的格式
设置(开启)访问日志 access_log
6.2 log_format日志格式
#01 位置
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#02 格式说明
log_format 格式 :
$remote_addr 客户端ip 地址
$remote_user 远程的用户(一般是空的)
$time_local 时间 11/May/2021:10:23:35 +0800
$request 请求报文的起始行 + uri+ 协议
$status 响应报文的状态码
$body_bytes_sent http 响应报文的主体大小(服务器给你发送文件的大小 单位字节)
$http_referer 从哪里跳转到你的网站 (分析用户的来源 可以精确的投放广告 :比如通过百度搜索 访问的 或者其它渠道)
$http_user_agent 用户的代理 (浏览器 类型)
$http_x_forwarded_for 记录用户ip 真实地址
#03 例如
10.0.0.7 - - [11/May/2021:10:29:19 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0" "-"
6.3 访问日志 access_log
- 语法说明
Syntax: | access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; |
---|---|
Default: | access_log logs/access.log combined; |
Context: | http , server , location , if in location , limit_except |
#01 配置参数
access_log配置
格式:
buffer=size gzip=lecel flush=time if=condition;
#access_log off;
access_log /var/log/nginx/www_access.log main ;
解释下:
path #是路径
format #日志格式
gzip #是否压缩 注压缩后日志最好命名为access.log.gz
fush #保存在缓存区中的最长时间 定时更新到磁盘 单位s 秒
buffer #设置内存缓存区大小
access_log off; #关闭日志
- 简单使用 配置访问日志
#案例01 要求先放进缓存区 3秒后写入磁盘 日志位置 /var/log/nginx/www_access.log
#01 书写配置文件
[root@kq_mysql conf.d]# cat www.conf
server {
listen 80;
server_name 10.0.0.101;
access_log /var/log/nginx/www_access.log main
buffer=128 flush=3;
location / {
root /code/www;
index index.html index.html;
}
}
#02 重载服务并运行测试
nginx -t
nginx -s reload
curl 10.0.0.101
[root@kq_mysql conf.d]# cat /var/log/nginx/www_access.log
10.0.0.101 - - [16/Aug/2023:15:47:42 +0800] "GET / HTTP/1.1" 200 38 "-" "curl/7.29.0" "-"
10.0.0.101 - - [16/Aug/2023:15:47:43 +0800] "GET / HTTP/1.1" 200 38 "-" "curl/7.29.0" "-"
10.0.0.101 - - [16/Aug/2023:15:47:44 +0800] "GET / HTTP/1.1" 200 38 "-" "curl/7.29.0" "-"
10.0.0.101 - - [16/Aug/2023:15:47:44 +0800] "GET / HTTP/1.1" 200 38 "-" "curl/7.29.0" "-"
----
#案例02 要求压缩 日志先写入到缓存 每隔3s写入到磁盘
#01 书写配置文件
[root@kq_mysql conf.d]# cat www.conf
server {
listen 80;
server_name 10.0.0.101;
access_log /var/log/nginx/www_access.log.gz main
gzip buffer=128 flush=3;
location / {
root /code/www;
index index.html index.html;
}
}
#02 检查并重启
[root@kq_mysql 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@kq_mysql conf.d]# nginx -s reload
[root@kq_mysql conf.d]# curl 10.0.0.101
#03 检查是否有压缩日志文件
[root@kq_mysql conf.d]# ll /var/log/nginx/
总用量 16
-rw-r--r-- 1 root root 552 8月 16 15:16 access.log
-rw-r--r-- 1 root root 533 8月 16 15:51 error.log
-rw-r--r-- 1 root root 460 8月 16 15:47 www_access.log
-rw-r--r-- 1 root root 574 8月 16 15:52 www_access.log.gz
#04 解压检查日志
gunzip /var/log/nginx/www_access.log.gz
cat /var/log/nginx/www_access.log.gz
6.4 错误日志格式
- 语法
error_log 错误日志 | ||
---|---|---|
syntax | error_log file [level]; | |
Default: | error_log logs/error.log error; | |
Context: | main , http , mail , stream , server , location |
- 简单使用
#01 配置错误日志 级别为 error
[root@kq_mysql nginx]# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name 10.0.0.101;
access_log /var/log/nginx/www_access.log main;
location / {
root /code/www;
index index.html index.html;
}
error_log /var/log/nginx/error_www.com.log error;
}
#02 检查语法并重载
[root@kq_mysql nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@kq_mysql nginx]# nginx -s reload
#03 估计写错 检查是否有error日志
[root@kq_mysql nginx]# curl 10.0.0.101/1123
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@kq_mysql nginx]# curl 10.0.0.101/1123333
#04 错误日志内容
[root@kq_mysql nginx]# cat error_www.com.log
2023/08/16 16:04:33 [error] 23963#23963: *27 open() "/code/www/1123" failed (2: No such file or directory), client: 10.0.0.101, server: 10.0.0.101, request: "GET /1123 HTTP/1.1", host: "10.0.0.101"
2023/08/16 16:04:36 [error] 23962#23962: *28 open() "/code/www/1123333" failed (2: No such file or directory), client: 10.0.0.101, server: 10.0.0.101, request: "GET /1123333 HTTP/1.1", host: "10.0.0.101"
2023/08/16 16:04:37 [error] 23962#23962: *29 open() "/code/www/1123333" failed (2: No such file or directory), client: 10.0.0.101, server: 10.0.0.101, request: "GET /1123333 HTTP/1.1", host: "10.0.0.101"
6.5 日志切割
#日志切割: 定期把切割成一个新的文件(加上日期). 避免日志过大
#如何实现:
##logrotate 命令 + /etc/logroate.d/配置文件
logroate -f /etc/logroate.d/nginx
[root@web01 nginx]$ cat /etc/logrotate.d/nginx
/var/log/nginx/*.log { # 指定你要切割的文件
dily # 每天
mssingok # 如果日志不存在 则跳过 不显示错误信息
rtate 52 # 最多保留多少个切割后的日志
cmpress # 日志是否压缩
dlaycompress # 延迟一个周期 然后再进行压缩
ntifempty # 如果日志是空的 则跳过
ceate 640 nginx adm # 日志的权限 所有者和所有组
saredscripts
pstrotate # 日志轮询 (切割之后) 执行里面的命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
# 定期切割原理
系统定时任务 会每天都执行
[root@web01 nginx]$ cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
七. nginx处理请求流程
#01 流程如下
1. 用户输入url域名
2. DNS解析:查找域名对应的ip地址(获得域名对应的ip地址)
3. tcp3次握手:用户通过ip地址与对应的服务器建立连接(与服务器连接)
4. http请求报文(豹纹):建立tcp连接后,用户向服务器索要指定的内容(页面,
图片,视频....) (向服务索要内容)
5. 服务器通过查找 (nginx如何处理请求)
6. http响应豹纹: 找到后把用户要的内容,返还给用户(服务型响应用户)
7. tcp4次挥手: 用户与服务器断开连接
#匹配相关
nginx 处理请求流程 (使用域名)
1 根据http请求报文 匹配到http 模块
2 根据host 匹配对应的server
3 根据uri 匹配location 没有对应的location 就使用默认的
最后跟进用户请求的uri 找出站点目录下面(root ) 目录和文件
八. nginx常用模块
8.1 autoindex 目录索引模块
语法要求
autoindex_module
autoindex 是否开启目录索引功能
autoindex_exact_size 是否以人类可读形式显示大小(off), on(精确
显示)
使用场景:用户访问nginx的时候,可以像使用ftp工具一样,下载网站站点下面的文件
- 简单使用
#01 配置server区 提供下载
cat ftp.conf
server {
listen 80;
server_name ftp.zhangyuzhou.com;
charset utf-8;
root /code;
location /download {
autoindex on;
autoindex_exact_size off;
}
}
#02 注意需要做hosts解析
echo "10.0.0.101 ftp.zhangyuzhou.com" >>/etc/hosts
#03 传数据到下载的站点目录
mkdir -p /code/download/
echo '123' >>/code/download/test.txt
#04 检查重载并下载
nginx -t
nginx -s reload
#04 页面访问
ftp.zhangyuzhou.com/
8.2 nginx状态模块
- ngx_http_stub_status_module 显示nginx状态
- stub_status
stub_status nginx状态模块使用
格式 stub_status
context server,location
- 简单使用
#01 添加状态模块
[root@web01 nginx]# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.zhangyuzhou.com;
access_log /var/log/nginx/www_access.log main ;
location / {
root /code/www ;
index index.html index.html;
}
location /favicon.ico {
access_log off;
return 200 ;
}
location /status { #添加location 站点
stub_status; #添加stub_status
}
}
#02 检查并重启
ngxin -t
nginx -s reload
#03 测试 curlwww.zhangyuzhou.com
[root@kq_mysql conf.d]# curl www.zhangyuzhou.com/status
Active connections: 1
server accepts handled requests
30 30 30
Reading: 0 Writing: 1 Waiting: 0
#04 stub_status 状态
Active connections: 3 #当前活动连接(已经连接的连接)
server accepts #已经接受的http请求(总数) 一般是和handled数量一致
handled #已经处理的htp请求(总数)
requests #—共向我发送了多少请求(总数)
Reading: 0 #当前正在读取用户请求头的数量(实时)
writing:1 #当前正在发送响应报文的数量
waiting 2 #当前排队的数量
8.3 访问限制模块
ngx_http_access_module 访问限制模块
allow 准许 某个ip或网段访问
deny 拒绝
使用allow和deny 完成白名单和黑名单功能
白名单: allow,deny常用,用来限制核心目录,文件,禁止外界访问.
黑名单:deny, 屏蔽ip地址.
简单使用
#01 白名单 在名单中的可以访问
##先allow
##最后deny all
#02 书写配置
location /status {
stub_status;
access_log off;
allow 172.16.1.0/24;
allow 10.0.0.7;
allow 127.0.0.1;
deny all;
}
解释下:
deny all 除了已经授权允许的 其它的全部拒绝
#03 测试
8.4 auth_basic_user用户授权模块
- ngx_http_auth_basic_module
- 限制用户访问,访问的时候输入用户名和密码
auth_basic 显示登入提示 | ||
---|---|---|
语法 | auth_basic "提示信息" off | |
默认 | auth_basic off; | |
context | http , server , location , limit_except |
auth_basic_user_file *file* |
||
---|---|---|
语法 | auth_basic_user_file conf/htpasswd | |
默认 | 无 | |
context | http , server , location , limit_except |
|
# 应用案例
#让用户访问 www.zhangyuzhou.com/status 需要输入用户名和密码
##创建nginx auth_basic_user_file 需要的密码文件
zhangyz 123456 conf.d/status.pass
# 实施步骤
# htpasswd -b -c
-b 使用批处理方式,直接从命令行获取密码,不提示用户输入
-c 创建密码文件,如果文件存在,那么内容被清空重写
创建密码文件
yum install -y httpd-tools
htpasswd -bc status.pass zhangyz 123456
# 修改密码文件权限
chmod 600 status.pass
chown nginx.nginx status.pass
#修改配置文件
server }
...
location /status {
stub_status;
auth_basic "Input user password:"; # 给status模块 添加用户访问限制提示信息 "Input password"
auth_basic_user_file conf.d/status.pass; # 指定用户和密码文件
....
# 测试
curl -u zhangyz:123456 www.zhangyuzhou.com/status
- 访问网站 测试
- 输入密码
九.location 功能
- 匹配用户请求中的uri.
location | ||
---|---|---|
语法 | Syntax: location [ = |~| ~*| ^~] uri { ... } location @name |
|
上下文 | server , location |
特殊字符
location
= 精确匹配uri 优先级别 最高
^~ 匹配uri,不使用正侧表达式 高优先级
~ 区分大小写的正则匹配 优先级和~一致 谁在前面先匹配谁
~* 不区分大小写的正则匹配 (例如 location ~.(jpg|png|gif)$ 匹配以.jpg或者.pnp结尾的所有内容
/ 通用匹配,默认:其它location匹配失败了 则会匹配这个 优先级最低正侧:用符号匹配有规律的内容 注意:location 不支持!= !~ !~*写法 这些需要在if中才能使用
书写测试文件 location.conf
[root@centos7 conf.d]# cat location.conf
server {
listen 80;
server_name 192.168.5.14;
# location / {
# default_type text/html;
# return 200 " B / " ;
#}
location = / {
default_type text/html;
return 200 " A = " ;
}
location ^~ / {
default_type text/html;
return 200 " C ";
}
location ~ / {
default_type text/html;
return 200 " D ~ " ;
}
location ~* / {
default_type text/html;
return 200 " E ~*" ;
}
}
测试:curl -H Host:location.com 10.0.0.7
10 LNMP部署系列
10.1 通用网站架构
1) 静态vs 动态
- 静态资源(请求_: nginx自己处理的内容, html,js,css,图片,视频,音频.......
- 动态资源(请求): 交互内容(评论,发布文章,订单,金钱) url连接中 包含
特殊符号 & 符号 或 ? 符号
- 动态请求需要开发语言处理: php,java,python,golang,......
静态 | 动态 | |
---|---|---|
处理 | nginx/apache/tengine | nginx+php/java/python/golang |
数据存放 | 站点目录 | 站点目录+数据库+存储 |
url | .html .css .js .png .mp4 ..... |
含有 & ? 特殊符号 |
效率 | 效率高 速度快 | 效率低,处理缓慢, |
是否容易被搜索引擎收入 | 容易被收入 | 不容易被收入.(伪静态:把动态url 伪装为静态url) |
2) 常用架构
架构 | ||
---|---|---|
LAMP | LInux Apache MySQL(MariaDB) PHP (Fastcgi) | |
LNMP/LEMP | LInux Nginx MySQL(MariaDB) PHP(Fastcgi) | |
LNMT | Linux Nginx MySQL Tomcat/Jboss/Resin/(java) Weblogic(配合Oracle数据苦) |
|
LNMP | Linux Nginx MySQL Python (Uwsgi) | |
LNM??? | Linux Nginx MySQL 自己开发 |
10.2 LNMP原理
- 用户发出请求后,请求到达nginx
- 如果是静态请求,nginx自己处理
- 如果是动态请求nginx 根据 请求类型(php) 通过fastcgi_pass 动态请求
交给 php-fpm(fastcgi)- php-fpm收到请求后,传递给php解释器(与数据库交互)
- 解释后把结果传递给用户(解释器-->php-fpm--->nginx--->用户)
- 完成动态请求过程
- php-fpm.conf 配置控制php-fpm进程
php.ini 控制解释器
10.3 lnmp 环境准备
服务器 | 服务 | 网站 | ip |
---|---|---|---|
Node01 | nginx php mariadb | shop,wordpess | 10.0.0.101 |
##要求 部署电商和博客
使用虚拟用户 www
shop.zyz.com --->> /code/shop
wordpess.zyz.com --->> /code/work
#01 创建虚拟用户
useradd -s /sbin/nologin -M -u 1111 www
[root@centos7 ~]# id www
uid=1111(www) gid=1111(www) 组=1111(www)
#02 创建站点目录
mkdir -p /code/{shop,wordpess}
chown www.www -R /code
#03 添加本地hosts解析
echo '10.0.0.101 shop.zyz.com work.zyz.com ' >> /etc/hosts
#04 关闭防火墙
systemctl stop firewalld.service
1)数据库部署
#01 安装数据库
yum install -y mariadb mariadb-server
#02 启动数据库 并检查
systemctl start mariadb
ss -natl | grep 3306
LISTEN 0 50 *:3306 *:*
#03 设置密码
[root@centos7 ~]# mysqladmin -u root password '123456'
[root@centos7 ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> exit
Bye
#03 创建用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
grant all on *.* to 'all'@'%' identified by '123456';
flush privileges;
select user,host from mysql.user;
#04 创建数据库
create database wordpress ;
create database shop ;
数据库地址 192.168.5.14
账户:all
密码:123456
库名称:wordpress
库名称:shop
----分隔符----
#04 数据库指令
help show 查询帮助
show databases ; 查看所有数据库 (show 例如:ll)
show tables ; 查看表格
use 进入目录 (use 例如:cd)
select user,host from mysql.user; 查看当前数据库用户信息 select (字段 列) from 数据库,表
create database wordpress ; 创建数据库
drop user ''@'root' ; 删除用户
2)php部署
#01 卸载原来的php
[root@centos7 ~]# yum remove php-mysql-5.4 php php-fpm php-common
#02 配置php 源
[root@centos7 ~]# cat /etc/yum.repos.d/php.repo
[webtatic-php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
#03 下载php
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
yum install -y php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
[root@centos7 ~]# rpm -qa | egrep 'php|nginx'
php71w-common-7.1.33-1.w7.x86_64
php71w-mysqlnd-7.1.33-1.w7.x86_64
php71w-mbstring-7.1.33-1.w7.x86_64
php71w-pecl-redis-3.1.6-1.w7.x86_64
nginx-filesystem-1.20.1-10.el7.noarch
php71w-cli-7.1.33-1.w7.x86_64
php71w-devel-7.1.33-1.w7.x86_64
mod_php71w-7.1.33-1.w7.x86_64
php71w-pdo-7.1.33-1.w7.x86_64
php71w-gd-7.1.33-1.w7.x86_64
php71w-mcrypt-7.1.33-1.w7.x86_64
php71w-fpm-7.1.33-1.w7.x86_64
php71w-process-7.1.33-1.w7.x86_64
php71w-pecl-igbinary-2.0.5-1.w7.x86_64
php71w-pecl-memcached-3.0.4-1.w7.x86_64
nginx-1.20.1-10.el7.x86_64
php71w-embedded-7.1.33-1.w7.x86_64
php71w-xml-7.1.33-1.w7.x86_64
php71w-opcache-7.1.33-1.w7.x86_64
php71w-pear-1.10.4-1.w7.noarch
php71w-pecl-mongodb-1.5.3-1.w7.x86_64
#04 修改php默认启动用户
[root@centos7 ~]# sed -i 's#apache;#www;#g' /etc/nginx/nginx.conf
[root@centos7 ~]# egrep '^(user|group)' /etc/php-fpm.d/www.conf
user = apache
group = apache
#04 启动服务
systemctl start php-fpm.service
systemctl enable php-fpm.service
#05 检查进程
[root@centos7 ~]# ps -ef | grep php
root 17521 1 1 16:14 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
apache 17522 17521 0 16:14 ? 00:00:00 php-fpm: pool www
apache 17523 17521 0 16:14 ? 00:00:00 php-fpm: pool www
apache 17524 17521 0 16:14 ? 00:00:00 php-fpm: pool www
apache 17525 17521 0 16:14 ? 00:00:00 php-fpm: pool www
apache 17526 17521 0 16:14 ? 00:00:00 php-fpm: pool www
root 17594 2297 0 16:14 pts/1 00:00:00 grep --color=auto php
3)nginx 部署
- wordpess
#01 下载nginx 并替换默认启动用户
[root@centos7 conf.d]# yum insatll -y nginx
[root@centos7 conf.d]# sed -i 's#user nginx;#user www;#g' /etc/nginx/nginx.conf
[root@centos7 conf.d]# egrep '^(user)' /etc/nginx/nginx.conf
user www;
#01 书写配置文件
[root@centos7 conf.d]# cat wordpess.conf
server {
listen 80;
server_name wordpess.zyz.com;
access_log /var/log/nginx/blog_access.log main;
error_log /var/log/nginx/blog_error.log notice;
root /code/wordpess;
location / {
index index.html index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params ;
}
}
#03 上传代码
cd /code/wordpess
wget http://192.168.1.159/download/game/%E5%8D%9A%E5%AE%A2.tar.gz
tar xf 博客.tar.gz
mv wordpress/* ./
rm -rf wordpress
#04 启动nginx 并检查
systemctl start nginx
- 页面访问
- 站点信息
- shop
#01 书写配置文件
[root@web-101 conf.d]$ cat shop.zyz.com.conf
server {
listen 80;
server_name shop.zyz.com;
access_log /var/log/nginx/shop_access.log main;
error_log /var/log/nginx/shop_error.log notice;
root /code/phpshe;
location / {
index index.html index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params ;
}
}
nginx -t
nginx -s reload
#02 代码上线
cd /code/shop
wget http://192.168.1.159/download/game/dianshang.zip
rm -f dianshang.zipmv
dianshang/* ./
chown www.www -R /code
#03 测试
[root@centos7 shop]# cat config.php
<?php
$pe['db_host'] = '192.168.5.14'; //数据库主机地址
$pe['db_name'] = 'shop'; //数据库名称
$pe['db_user'] = 'all'; //数据库用户名
$pe['db_pw'] = '123456'; //数据库密码
$pe['db_coding'] = 'utf8';
$pe['url_model'] = 'pathinfo_safe'; //url模式,可选项(pathinfo/pathinfo_safe/php)
define('dbpre','pe_'); //数据库表前缀
# 修改权限
[root@centos7 shop]# mkdir -p /var/lib/php/session
[root@centos7 shop]# chown -R www.www /var/lib/php/session
Nginx-web系列的更多相关文章
- 20步打造最安全的NGINX WEB服务器
Nginx 是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器.它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Wind ...
- 构建高效安全的Nginx Web服务器
一 为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早.Apache HTTP Server(简称Apache)是世界使用排 ...
- web系列教程之php 与mysql 动态网站 。检索 与更新。
接着上次WEb 系列开发之php 与mysql动态网站入门. 个人觉得,学习技术就像一棵大树,主干很重要,枝叶其次.对于学习技术,我们应该分清主次关系.怎么学?为什么要学?有一个较好的分寸. 有时候觉 ...
- Nginx学习系列二Linux下Nginx实现负载均衡
关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...
- 从零开始学 Web 系列教程
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新…… github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http:/ ...
- Linux Nginx Web环境安装SSL证书后强行指向HTTPS方法
如今我们越来越多的网站需要使用SSL证书,尤其是一些购物类网站,用户交互类网站使用居多.安装方法也很简单,我们可以根据自己的服务器是NGINX还是APACHE进行安装,但是在安装之后,默认的HTTP和 ...
- 2-4、nginx特性及基础概念-nginx web服务配置详解
Nginx Nginx:engine X 调用了libevent:高性能的网络库 epoll():基于事件驱动event的网络库文件 Nginx的特性: 模块化设计.较好扩展性(不支持模块动态装卸载, ...
- nginx web服务器应用
Nginx介绍 Nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件,因具有高并发(特别是静态资源),占用系统资源少等特性,且功能丰富而逐渐流行起来.功能应用上,Nginx不但是一个优 ...
- Linux实战教学笔记38:企业级Nginx Web服务优化实战(下)
四,Nginx站点目录及文件URL访问控制 4.1 根据扩展名限制程序和文件访问 Web2.0时代,绝大多数网站都是以用户为中心多的,例如:bbs,blog,sns产品,这几个产品都有一个共同特点,就 ...
- Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)
一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的.因此,我们应尽量隐 ...
随机推荐
- TienChin 渠道管理-表创建
在若依当中,有个槽点,就是数据库当中的删除标识状态一般 0 是 false,1 是 true,在若依当中反而 0 是 true,1 是 false. 渠道表设计,我这里就直接贴成品的创建表 SQL: ...
- 2.7 CE修改器:多级指针查找
在本步骤中,你需要使用多级指针的概念来查找健康值真正的地址并修改它.多级指针就是一个指针的指针,也就是第一个指针指向第二个指针,第二个指针指向第三个指针,以此类推,最终指向你想要访问的地址. 首先,你 ...
- 2.1 PE结构:文件映射进内存
PE结构是Windows系统下最常用的可执行文件格式,理解PE文件格式不仅可以理解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,在任何一款操作系统中,可执行程序在被装入内存之 ...
- Python 调用Zoomeye搜索接口
钟馗之眼是一个强大的搜索引擎,不同于百度谷歌,它主要收集网络中的主机,服务等信息,国内互联网安全厂商知道创宇开放了他们的海量数据库,对之前沉淀的数据进行了整合.整理,打造了一个名符其实的网络空间搜索引 ...
- Linux下的gcc/g++编译器的使用 [补档-2023-06-13]
gcc编译器 这东西是Linux上的c/c++编译器. 5-1 gcc的工作流程 5-2 gcc的常用参数 -v 查看gcc版本号, --version也可以 -E 生成预处理文件 -S 生成汇编 ...
- Linux-yum卸载软件包
yum是Linux操作系统中最常用的软件包管理器之一,它可以帮助你很容易地安装.删除和更新软件包.然而,有时候yum在删除软件包时可能会出现一些问题,本文将告诉你如何正确地使用yum卸载软件包,并解决 ...
- LVM(逻辑卷管理器)
目录 一.LVM概述 二.基本术语 三.PE.PV.VG.LV之间的关系 四.LVM的工作原理 五.LVM的使用 1.部署逻辑卷 第一步: 还原快照,并在虚拟机添加两块新硬盘设备,开机 第二步: 让新 ...
- 【若归】 【LGR-142-Div.4】洛谷入门赛 #13赛后反思
比赛链接:[LGR-142-Div.4]洛谷入门赛 #13 rk288,比前几次差(可能是因为rated?) A 十年OI一场空,不开long long见祖宗 #include<bits/std ...
- NC20477 [ZJOI2008]树的统计COUNT
题目链接 题目 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II ...
- NC235247 Sramoc问题
题目链接 题目 题目描述 \(Sramoc(K ,M)\) 表示用数字 \(0,1,2,3,4,...,k-1\) 组成的自然数中能被M整除的最小数.给定 \(K,M\) \(2\leq K\leq ...