nginx
第一章 安装nginx
1.1 nginx
1.1.1 nginx简介
- nginx是一款高性能的http和反向代理服务器
1.1.2 nginx优点 - IO多路复用(epoll): 采用异步非阻塞的驱动模型, 无需为每个连接创建独立的线程, 并能高效处理高并发的业务场景
1.1.3 yum安装nginx - https://nginx.org/en/linux_packages.html#RHEL: 访问nginx安装手册
- yum install yum-utils: 安装yum扩展源
- 修改yum仓库, 下载稳定版本nginx
vim /etc/yum.repos.d/nginx.repo
[nginx-stable] //稳定版
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/releasever/releasever/releasever/basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline] //开发版
name=nginx mainline repo
baseurl=https://nginx.org/packages/mainline/centos/releasever/releasever/releasever/basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
4. yum -y install nginx: 安装nginx
5. 启动nginx, 配置开机自启, 并测试
systemctl start nginx
systemctl enable nginx
http://192.168.255.132:80
第二章 nginx常用配置文件
- rpm -ql nginx: 查看nginx所有安装目录
- /etc/logrotate.d/nginx: nginx的日志轮转目录
- /etc/nginx/nginx.conf: nginx主配置文件
- /etc/nginx/conf.d: nginx子配置目录
- /etc/nginx/conf.d/default.conf:nginx默认网站配置文件
- /etc/nginx/mime.types: ngixn的文件关联程序
- /etc/nginx/modules: nginx模块目录
- /var/log/nginx/access.log: nginx服务访问日志
- /var/log/nginx/error.log: nginx的错误日志
- /usr/lib/systemd/system/nginx.servirce.systemctl: nginx服务脚本
- /usr/sbin/nginx: nginx的主程序
第三章 nginx编译参数 - nginx -V: 查看nginx所有编译参数
第四章 nginx的基本配置
4.1 配置文件组成
4.1.1 主配置文件 - 核心模块: 管理进程数
- 事件驱动模块: 管理进程网络连接数
- http内核模块-http: 配置代理, 缓存, 日志
4.1.2 子配置文件 - 网站服务模块-server: 配置网站服务
- local模块: 配置各种请求路径, 应对不同网站响应
4.1.3 网站服务模块组成 - listen 80: 指定网站资源端口
- server_name: 指定网站资源域名
4.1.4 local模块组成 - root /网站资源路径: 指定域名访问的资源路径
- index index.html: 指定网站资源首页
第五章 nginx的日志
5.1 日志配置
5.1.1 日志格式
vim /etc/nginx/nginx.conf
http{
log_format 日志名 日志变量;
access_log /var/log/nginx/access.log 日志名;
}
5.1.2 日志变量 - $remote_addr: 客户机ip
- $remote_user: 访问用户
- $request: 请求信息
- $status: 响应信息
- $body_bytes_sent: 响应的字节数
- $http_referer: 记录来源链接
- $http_user_agent: 客户机浏览器信息
- $http_x_forwarded_for: 代理ip
5.1.3 日志缓存 - 作用: 解决记录每一条日志都需要打开日志文件,之后在关闭日志文件, 会占用系统IO
- 配置:
server{
open_log_file_cache max=1000 inactive=20s min_uses=3 valid=1m
}: 缓存最多1000, 当到达日志IO的极限, 开始清除20秒内小于三次的日志IO,
注意: - log_format: 指定日志格式
- access_log: 指定访问日志存放路径
- error_log: 指定错误日志存放路径
- open_log_file_cache: 开启日志缓存
- 日志缓存默认是关闭的
- 日志缓存并不建议开启, 因为开启后会占用内存
5.2 日志分析
1.统计2017年9月5日PV量
2.统计2017年9月5日一天内访问最多的10个IP(iptop10)
3.统计2017年9月5日访问大于100次的IP
4.统计2017年9月5日访问最多的10个页面(requesttop10)5.统计2017年9月5日每个URL访问内容总大(request top10) 5.统计2017年9月5日每个URL访问内容总大(requesttop10)5.统计2017年9月5日每个URL访问内容总大(body_bytes_senbt)
6.统计2017年9月5日每个IP访问状态码数量(status)7.统计2017年9月5日每个IP访问状态码为404及出现次数(status) 7.统计2017年9月5日每个IP访问状态码为404及出现次数(status)7.统计2017年9月5日每个IP访问状态码为404及出现次数(status)
8.统计前一分钟的PV量
9.统计2017年9月5日8:30-9:00,每个IP,出现404状态码的数量
10.统计2017年9月5日各种状态码数量
第六章 nginx的web模块
6.1 连接状态
6.1.1 作用 - 展示用户连接nginx服务的信息
6.1.2 配置 - nginx -V 2>&1 | grep stub_status_module: 查询是否安装
- 配置连接状态
vim /etc/nginx/conf.d/crb.conf
server{
location /nginx_status {
stub_status;
}
} - http://crb.com/名称: 查看连接用户连接信息’’
- active connections: 反应当前服务的活跃连接数
- server accepts handled requests: 总连接数, 成功连接数, http请求数量
注意: - 在server中设置keepalive_timeout 60: 表示长连接超时时间
- 长连接超时时间用于设置一次tcp连接的超时时间
6.2 随机主页
6.2.1 作用 - 将服务主页设置为随机页面, 用于提高用户粘性
6.2.2 配置 - 在/crb/app目录创建多个html首页
- 配置随机主页
vim /etc/nginx/conf.d/crb.conf
location / {
#root /crb
#index index.html
root /app //随机主页的资源目录
random_index on; //开启随机主页
}
注意: - 随机主页不能设置为隐藏文件
6.3 替换模块
6.3.1 作用 - 用于网页页面中字符出错, 做临时替换
6.3.2 配置 - 配置替换模块
vim /etc/nginx/conf.d/crb.conf
server{
sub_filter nginx ‘test’; //将所有nginx替换为test
}
6.4 文件读取
6.4.1 作用 - 跳过用户空间的文件数据拷贝, 提高文件的传输效率
注意: - 文件读取三个参数: sendfile, tcp_nopush(), tcp_nodelay
- tcp_nopush: 默认禁用, 开启后数据包会积累到一定后发送, 避免资源浪费
- tcp_nodelay: 默认禁用, 开启tcp_nopush需要开启该参数, 避免ack包因延迟的重传, 也就是遇到ack包立即传输
6.4.2 配置 - 配置文件模块
vim /etc/nginx/conf.d/crb.conf
server {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
6.5 文件压缩
6.5.1 作用 - 文件在传输前对文件进行压缩, 提高传输效率
6.5.2 配置 - vim /etc/nginx/conf.d/crb.conf
server {
gzip on; //开启文件压缩
gzip_http_version 1.1; //版本
gzip_comp_level 2; //压缩等级1~9
gzip_type text/plain application/javascript application/x-javascript text/CSS application/xml text/javascript application/x-httpd-php image/jpegimage/gif image/png; //指定压缩文件类型
gzip_static on; //静态压缩
}
6.6 页面缓存
6.6.1 作用 - 使用缓存机制, 减少请求nginx服务的次数, 减轻服务的压力
6.6.2 配置 - 配置页面缓存
vim /etc/nginx/conf.d/crb.conf
server {
expire 12h; //指定缓存过期时间
}
6.7 防盗链
6.7.1 作用 - 防止服务网站的连接被盗用, 导致nginx服务器资源的浪费
6.7.2 配置 - vim /etc/nginx/conf.d/crb.conf
#匹配所有gif/jpg/png/bmp格式的图片文件(不区分大小写)
location ~*.(gif|jpg|png|bmp)$ {
root /a.com;
定义合法的referer来源(只有这些来源的请求才被允许)
valid_referers
none # 允许无referer的请求(如直接浏览器输入图片URL)
blocked # 允许referer被防火墙/代理屏蔽的请求
*.qfcloud.top # 允许qfcloud.top的所有子域名
server_names # 允许当前服务器域名作为referer
-tianyun # 排除referer包含"tianyun"的请求(-表示排除)
~.google.com # 允许google.com域名(~表示正则匹配,.转义点号)
~.baidu.com; # 允许baidu.com域名(结尾必须加分号)
如果referer不合法($invalid_referer为true)
if ($invalid_referer) {
return 403;
}
}
第七章 nginx访问限制
7.1 请求限制
7.1.1 作用
- 限制单用户的请求频率
7.1.2 配置 - 配置请求访问限制
vim /etc/nginx/nginx.conf
http {
limit_req_zone $binary_remote_addr zone=req_zone_crb:10m rate=1r/s; //每秒内仅允许一次http请求, 并将ip以二进制形式记录, 并且创建10mb内存空间, 存放ip, 错误日志也会存放
} - 引用请求访问限制
vim /etc/nginx/conf.d/crb.conf
server{
location / {
limit_req zone=req_zone_crb;
}
} - 压力测试
yum -y install httpd-tools
ab -n 1000 -c 100 http://crb.com/
7.2 连接限制
7.2.1 作用 - 限制单用户与服务器的并发连接数
7.2.2 配置 - 配置连接访问限制
vim /etc/nginx/nginx.conf
http {
limit_conn_zone $binary_remote_addr zone=conn_zone_crb:10m //定义连接限制, 并将ip以二进制形式记录, 并且创建10mb内存空间, 存放ip, 错误日志也会存放
} - 引用请求访问限制
vim /etc/nginx/conf.d/crb.conf
server{
location / {
limit_conn conn_zone_crb 5; //单用户并发连接数不能超过5
}
}
第八章 nginx访问控制
8.1 ip访问控制
8.1.1 作用 - 禁止某ip对网站的访问
8.1.2 配置 - vim /etc/nginx/conf.d/nginx.conf
server{ //禁止12与130的访问, 其他人都可以
allow all;
deny 192.168.255.12;
deny 192.168.255.130;iop
}
8.2 用户访问控制
8.2.1 作用 - 使用用户名与密码形式, 控制网站的访问
8.2.2 配置 - 安装httpd-tools, 并创建用户
yum -y install httpd
htpasswd -cm /etc/nginx/conf.d/user user01: 创建用户文件并创建user01
htpasswd -m /etc/nginx/conf.d/user user02: 创建用户user02 - 引用用户配置
vim /etc/nginx/conf.d/crb.conf
server {
auth_basic “用户访问控制”
auth_basic_user_file /etc/nginx/conf.d/user
}
注意:
200: 表示成功
204: 表示成功, 单响应信息没有body
301: 表示资源永久性重定向, 请求资源已经不在
302: 表示资源临时性重定向, 请求资源还在
400: 请求报文存在语法错误
403: 请求资源被拒绝访问
404: 服务器上无法找到请求的资源
500: 表示服务器在执行请求时存在错误
502: 当前代理服务器正常, 访问后端服务器出错
503: 服务器处于维护状态
第九章 nginx代理服务
9.1 代理原理
9.1.1 正向代理 - 内网客户机通过代理服务访问互联网
9.1.2 反向代理 - 外网客户机通过通过代理服务访问内网服务器
注意: - 正向代理服务对象是客户机, 反向代理服务对象是服务器
- 正向代理隐藏客户机, 反向代理隐藏服务器
- 正向代理部署靠近客户端, 反向代理部署靠近服务器
9.2 代理服务
9.2.1 作用 - 隐藏后端web资源架构, 避免遭受直接攻击, 同时通过缓存静态资源,减少后端web服务的压力
9.2.3 配置代理服务
9.2.3.1 关闭root, index, expire - 在网站对应配置文件中, 关闭root, index, expire
vim /etc/nginx/conf.d/crb.conf
location / {
root
index
expire
}
9.2.3.2 配置web代理集群
- 在网站对应的配置文件中, 配置集群
vim /etc/nginx/conf.d/crb.conf
upstream web集群名称 {
server 192.168.255.129:80 weight=3; //权重3, 接收3倍请求
server 192.168.255.130:80 weight=1;
server 192.168.255.131:80 backup; //备用节点, 主节点故启用
server 192.168.255.132:80 down; //标记下线节点
max_fails 3; //3次请求失败, 判定节点故障
fail_timeout 60s; //失败后60秒内, 故障节点不在接收请求
}
注意: - upstream不用放在server{}中, 可以单独定义或放在http{}中定义
- upstream的名称后面代理需要引用
- 单节点不用配置upstream
9.2.3.3 配置代理服务服务的转发 - 在网站对应的配置文件中, 配代理转发
vim /etc/nginx/conf.d/crb.conf
location / {
proxy_pass http://web集群名称; //将用户请求转发到后端集群, 若后端web为单节点, 直接配置ip:port即可
proxy_redirect default; //自动修正域名, 将web服务ip, 替换为web服务域名
}
9.2.3.4 配置请求头传递 - 在网站对应的配置文件中, 配置请求传递
vim /etc/nginx/conf.d/crb.conf
location / {
proxy_set_header Host $http_host; //把客户端访问的url传递给后端
proxy_set_header X-Real-IP $remote_addr; //把客户端的真实ip写入X-Real-IP头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; //记录整个访问链路
}
9.2.3.5 配置超时控制 - 在网站对应的配置文件中, 配置超时控制
vim /etc/nginx/conf.d/crb.conf
location / {
proxy_connect_timeout 30; //nginx与后端web服务器建立TCP连接的超时时间为30秒
proxy_send_timeout 60; //nginx向后端发送请求的超时时间为60秒
proxy_read_timeout 60; //nginx等待后端响应的超时时间为60秒
}
9.2.3.6 配置代理缓冲区 - 在网站对应的配置文件中, 配置代理缓冲区
vim /etc/nginx/conf.d/crb.conf
location / {
proxy_buffering on; //开启代理缓冲区,ngixn先将响应数据全部收进缓冲区, 在分发给客户机
proxy_buffer_size 32k; //web服务的响应缓冲区大小为2k
proxy_buffers 4 128k; //设置响应体的换中区为4个, 每个大小为128k
proxy_busy_buffers_size 256k; //缓冲区繁忙时的最大容量256k
proxy_max_temp_file_size 256k; //响应数据超过缓冲区时, 临时文件的最大大小为256k; 若为0, 响应超缓冲区会直接发送给客户端
}
注意: - 缓冲区的作用是, web服务器只需将资源发送给nginx代理, 之后释放与nginx代理的连接, web服务器不用再等待旺火环境差的用户的接收
- 配置代理后, web服务的访问日志中的最后一个字段会显示请求经过的代理服务ip
9.3 代理缓存
9.3.1 代理缓存的形式 - 购买第三方cdn
- 配置本地缓存
9.3.2 作用 - 将静态资源存放在代理服务器的缓存中, 减少web服务的压力, 提高响应效率
9.3.2 代理缓存工作原理 - 将用户请求的url使用加密算法转换, 转换后的字符串作为缓存的一级目录, 对应的url资源保存在其中, 当用户发起请求时, 代理服务器接受请求, 之后将url加密, 将加密后的字符串, 与紫衫缓存的一级目录比对, 若相同, 则命中缓存
注意: - 代理缓存的url加密, 是方便判断混存是否命中, 规避url的长度, 同时具有唯一性
9.3.3 配置代理缓存 - 创建缓存文件存放目录
mkdir -p /nginx/cache - 在nginx的代理服务器的主配置文件中, 配置代理缓存
vim /etc/nginx/nginx.conf
http {
proxy_cache_path /nginx/cache levels=1:2 keys_zone=缓存名称:10m max_size=10g inactive=60m use_temp_path=off; //将缓存内容存放在/nginx/chche下的两层目录中, 并且在内存中创建10mb的内存共享区域, 来存储缓存加密的url与命中情况, 缓存的最大空间为10GB, 当缓存空间使用完后, 会删除使用频率最低的缓存, 设置缓存连续未命中的存活周期为60分钟, 禁用缓存备份
} - 打开代理服务器中网站对应的子配置文件, 引用缓存机制
vim /etc/nginx/conf.d/crb.conf
location / {
proxy_cache 缓存名称; //引用缓存配置
proxy_cache_valid 200 304 12h; //将http状态码为200和304的资源缓存12小时
proxy_cache_valid any 10m; //其他状态码的响应, 缓存10分钟
proxy_cache_key hosthosthosturiisargsis_argsisargsargs; //对缓存的url进行化哈希化, 方便比对是否命中缓存
add_header Nginx-Cache “$upstream_cache_status”; //将缓存是否命中, 体现在http的响应头中
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; //出现500, 502等错误, 访问其他web服务器
}
第十章nginx的location与url重写
10.1 location - =: 表示精确匹配,优先级也是最高的
- ~: 区分大小写的正则匹配
- ~*: 不区分大小写的正则匹配
- / : 通用匹配,任何请求都会匹配到
- ^~: 以某些字符串开头
- !~: 非(区分大小写匹配的正则)
- !~*: 非(不区分大小写匹配的正则)
注意: - location的优先级: 精确匹配 > 字符开头 > 正则匹配 > 通配
10.2 url重写
10.2.1 概念 - 将用户请求的原路径, 进行重新定位
10.2.2 重定向条件判断 - ~*: 正则匹配 (不区分大小写)
- !~: 非正则匹配 (区分大小写)
- !~*: 非正则 匹配 (不区分大小写)
- -f 和!-f: 用来判断是否存在文件
- -d 和!-d: 用来判断是否存在目录
- -e 和!-e: 用来判断是否存在文件或目录
- -x 和!-x: 用来判断文件是否可执行
10.2.3 变量 - $document_root: 针对当前请求的根路径设置
- $remote_addr: 客户端地址
- $request_filename: 当前请求的文件路径名(带网站的主目录/usr/local/nginx/html/images/a.jpg)
- $request_uri: 当前请求的文件路径名(不带网站的主目录/images/a.jpg)
- $scheme: 用的协议,比如http或者是https
- $server_nam: 请求到达的服务器名;
- $arg:请求中的参数;
- $host: 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
- $limit_rate: 对连接速率的限制;
- $request_method: 请求的方法,比如"GET"、"POST"等;
- $remote_port: 客户端端口号;
- $remote_user: 客户端用户名,认证用;
- $query_string: 与args相同;
- $server_protocol: 请求的协议版本,“HTTP/1.0"或"HTTP/1.1”;
- $server_addr: 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
- documenturi:与document_uri: 与documenturi:与uri一样,URI地址;
- $server_port: 请求到达的服务器端口号;
10.2.4 重写标志 - last: 停止处理当前ngx_http_rewrite_module,从指令之后的一个新的位置改变URI匹配搜索;
- break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则
- redirect: 返回302临时重定向,浏览器地址会显示跳转后的URL地址
- redirect url permanent: 返回301永久重定向,浏览器地址会显示跳转后URL地址
第十一章 LNMP
11.1 LNMP工作原理 - nginx代理接收用户请求, 若访问静态资源, nginx代理通过访问web服务或缓存, 将资源返回给用户; 若访问动态资源, nginx使用fastcgi, 调用php的fmp模块, 将请求交给php, 之后php调用mysql模块, 访问数据库, 之后将数据层层返回
注意: - nginx只能处理静态资源的
- fastcgi是nginx的动态请求接口, 通过fastcgi连接php-fpm, 实现将请求交给php
11.2 linux的部署 - 配置yum
- 关闭selinux
- 关闭firewalld
- 配置ip
11.3 nginx的部署 - 安装并启动nginx
yum -y install nginx
systemctl start nginx
systemctl enable nginx - 测试nginx的访问
http://192.168.255.130
11.4 php的部署 - 安装php
yum -y install php -php-mysqlnd gd php-gd - 配置php测试页面
vim /usr/share/nginx/html/index.php
- 配置nginx服务
vim /etc/nginx/conf/default.conf
location / {
index index.php
} - 重启并测试php的访问
systemctl restart nginx
http://192.168.255.130
11.5 mysql的部署 - 安装并启动mysql
yum -y install mariadb-server mariadb
systemctl start mariadb
systemctl enable mariadb - 配置用户
mysqladmin -u root password ‘66666’
mysql -u root -p’666666’
create database test;
create user ‘zs’@‘192.168.255.130’ identified by ‘666666’;
grant all on test.* to ‘zs’@‘192.168.255.130’;
flush privileges;
11.6 配置nginx的fsatcgi
vim /etc/nginx/conf.d/default.conf
location = /php_status { //php监控
fastcgi_pass php-fpm主机ip:9000;
fastcgi_param SCRIPT_FILENAME KaTeX parse error: Expected 'EOF', got '}' at position 46: …astcgi_params; }̲ location ~ \.p… { //梳理php请求
fastcgi_pass php-fpm主机ip:9000;
fastcgi_param SCRIPT_FILENAME documentrootdocument_rootdocumentrootfastcgi_script_name;
include fastcgi_params;
}
11.7 配置php的php-fpm - 配置phg
vim /etc/php-fpm.d/www.conf
pm = dynamic //启用动态管理模式
pm.start_servers = 32 //最开始启动php-fpm进程32个
pm.max_children = 512 //最大的php-fpm进程512个
pm.min_spare_servers = 32 //最小空闲的php-fpm进程数32个
pm.max_spare_servers=64 //最大空闲的php-fpm进程数64个, 避免大量请求关闭后, 空闲数量太多
pm.max_requests = 1500 //每个php-fpm进程处理的请求数, 超过重启该进程, 默认值为1024
user = nginx ; PHP-FPM 运行用户(必须和 Nginx 运行用户一致)
listen.allowed_clients=nginx服务ip //允许接收fsatcgi的ip
listen = 127.0.0.1:9000 //在php-fpm服务的9000端口监听, 来自nginx服务的请求
pm.status_path = /php_status //对应开启php程序监控
2. 重启php-fpm与nginx
systemctl restart php-fpm
netstat anpt | grep php-fpm
systemctl restart nginx
3. 测试
http://nginx的ip
注意:
- nginx的http{}影响范围是整个服务器
- nginx的server{}影响范围是一个网站服务
- nginx的location{}影响范围是网站服务中得到页面
- http服务占用80端口, https服务占用443端口
- https使用ssl的公钥与私钥实现对网站进行加密, 公钥进行加密, 私钥进行解密.
更多推荐




所有评论(0)