目录
一、nginx服务基础
1.1、nginx概述
1.2、nginx功能介绍
静态的web资源服务器html,图片,js,css,txt等静态资源
http/https协议的反向代理 ,7层 url
结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求
tcp/udp协议的请求转发(反向代理) 4层
1.3、基础特性
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
event-driven, aio, mmap,sendfile
1.4、Web服务相关的功能
虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
1.5、nginx应用场景
① 静态服务器 (图片、视频服务、文本)
② 动态服务
③ 反向代理, 负载均衡
④ 缓存服务
nginx 中http七层代理和四层代理
web服务器
做:代理 服务器
反向代理, 负载均衡
1.6、简述nginx和Apache的差异
Nginx是一个甚于事件的Web服务器,Apache是一个基于流程的服务器;
Nginx避免子进程的概念,Apache是基于子进程的;
Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
Nginx支持热部署,Apache不支持热部署;
Nginx对于静态文件处理具有更高效率,Apache相对一般;
Nginx在反向代理场景具有明显优势,Apache相对一般。
1.7、nginx架构
(1)首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要listen 的 **socket(listenfd)**之后,然后再 fork 出多个 worker 进程。(2)所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd读事件,然后在读事件里调用 accept 接受该连接。(解决惊群)(3)当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
1.8、nginx进程架构
Master工作过程细节
1.Master建listen的socket(listenfd)2.Master ,fork出Worker进程(fork:进程镜像)
3.新请求到来时,所有Worker进程的listonfd都变为可读;
4.Worker进程,竞争accept mutex,获胜的注册listenfd的读事件5.Worker进程,在读事件中,accept当前连接,并处理请求
Worker工作过程细节:
1.新请求到来时,所有Worker进程的listenfd都变为
可读;2.Worker进程,竞争accept mutex,获胜的注册
listenfd的读事件件
3.Worker进程,在读事件中,accept当前连接,4.Worker进程,读取请求、解析请求、处理请求、进行响应
1.9、nginx模块
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和SMTP协议的支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理 四层
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等。
二、nginx编译安装
2.1、nginx安装过程
1、首先关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2、将安装包上传到/opt目录下,安装依赖环境包
3、创建用户组:useradd -M -s /sbin/nologin nginx
4、解压软件包,然后配置软件的模块
tar zxf nginx-1.22.0.tar.gz
cd nginx-1.15.9/
./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_modulemake && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t ##检查配置文件是否配置正确
检查、启动、重启、停止nginx服务
2.2、nginx命令和kill命令
nginx
命令
|
kill
命令
|
含义
|
nginx -s relaod
|
kill -s HUP
|
重新加载配置文件
|
nginx -s stop
|
kill -9
(
KILL
)
|
立即停止
|
nginx -s quit
|
kill -3
(
QUIT
)
|
优雅的退出
|
nginx -s reopen
|
kill -s USR1
|
重新生成日志文件
|
nginx
|
kill -s USR2
|
飞行中升级
|
2.3、添加nginx服务
1、service 系统管理
vim /etc/init.d/nginx#!/bin/bash#chkconfig: 35 99 20 // 这是固定格式, 2345 表示运行级别,之后为开机执行顺序和关机执行顺序#description:Nginx Service Control Script // 这也是必须的COM="/usr/local/nginx/sbin/nginx"PID="/usr/local/nginx/logs/nginx.pid"case "$1" in start)$COM;;stop)kill -s QUIT $(cat $PID);;restart)$0 stop$0 start;;reload)kill -s HUP $(cat $PID);;*)echo "Usage: $0 {start|stop|restart|reload}"exit 1esacexit 0chmod +x /etc/init.d/nginxchkconfig --add nginx # 添加为系统服务systemctl stop nginxsystemctl start nginxservice nginx start|stop|restart|reload
vim /lib/systemd/system/nginx.service[Unit]Description=nginxAfter=network.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target---------------------------------------------------------[Unit]: 服务的说明Description: 描述服务After: 依赖,当依赖的服务启动之后再启动自定义的服务[Service] 服务运行参数的设置Type=forking 是后台运行的形式,使用此启动类型应同时指定PIDFile 以便 systemd 能够跟踪服务的主进程。ExecStart 为服务的具体运行命令ExecReload 为重启命令ExecStop 为停止命令PrivateTmp=True 表示给服务分配独立的临时空间注意:启动、重启、停止命令全部要求使用绝对路径[Install] 服务安装的相关设置,可设置为多用户---------------------------------------------------------chmod 754 /lib/systemd/system/nginx.servicesystemctl start nginx.servicesystemctl enable nginx.service
三、nginx主配置文件nginx.conf
3.1、全局配置
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 1; #工作进程数量,可配置成服务器内核数 * 2
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
3.2、I/O事件配置
events {
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096 个连接
}
#如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。/etc/security/limits.conf
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版
本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数
已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性
能表现。
3.3、HTTP配置
当httpd被请求的时候,才会被触发执行这里面的配置。使用“http { }”界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保持,以及后面要讲到的虚拟 Web 主机、PHP 解析等一系列设置,其中大部分配置语句都包含在子界定标记“server { }”内。
http {
##文件扩展名与文件类型映射表
include 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"';
##访问日志位置
#access_log logs/access.log main;
##支持文件发送(下载)
sendfile on;
##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web 服务的监听配置
server {
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server_name www.kgc.com;
##网页的默认字符集
charset utf-8;
##根目录配置
location / {
##网站根目录的位置/usr/local/nginx/html
root html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}
}
====================================================================日志格式设定:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。location常见配置指令,root、alias、proxy_pass
root(根路径配置):root /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/test/1.htmlalias(别名配置):alias /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/1.htmlproxy_pass(反向代理配置)
四、实战案例
4.1、基于授权的访问控制
1.生成用户密码认证文件。
2.修改主配置文件响应的目录,添加认证配置项。
3.重启服务,访问测试。
[root@nginx ~]# yum -y install httpd-tools #安装htpasswd软件
[root@nginx ~]# htpasswd -c /usr/local/nginx/passwd.db test
New password:
Re-type new password:
Adding password for user test
[root@nginx ~]# cat /usr/local/nginx/passwd.db
test:$apr1$w3EqIUYC$t3P0qM.xUTAy/qy8/nxu//
#-c在指定目录下生成一个新的配置文件,
#htpasswd /usr/local/nginx/passwd.db wzh 这个命令格式可以向用户认证文件添加一个新的用户
[root@nginx ~]# chmod 400 /usr/local/nginx/passwd.db
[root@nginx ~]# chown nginx /usr/local/nginx/passwd.db
[root@nginx ~]# ll -d /usr/local/nginx/passwd.db
-r-------- 1 nginx root 85 4月 1 09:41 /usr/local/nginx/passwd.db
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.bt.com;
charset utf-8;
location / {
root html;
index index.html index.htm;
#想让哪个网站被访问的时候弹出认证框就写入到哪个网站的location里面,也可以写入到状态统计的location里面,
auth_basic "secret"; #指定认证提示信息
auth_basic_user_file /usr/local/nginx/passwd.db; #指定存储用户名和密码的文件路径
}
}
[root@nginx ~]# nginx -t
[root@nginx ~]# systemctl restart nginx
4.2、基于客户端的访问控制
基于客户端的访问控制是通过客户端IP地址,决定是否允许对网页访问。
1.deny IP/IP段:决绝某个IP或IP段的客户端访问。
2.allow IP/IP段:允许某个IP或IP段的客户端访问。
3.规则从上往下执行,如匹配则停止,不再往下匹配。
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.bt.com;
charset utf-8;
location / {
root html;
index index.html index.htm;
#auth_basic "secret";
#auth_basic_user_file /usr/local/nginx/passwd.db;
#允许策略
#想对什么网站做限制,就把限制加入到location里面,同样也可以加入到状态统计的location里面
deny 192.168.93.100; #拒绝93.100
allow all; #允许其他所有IP地址
}
[root@nginx ~]# systemctl restart nginx
4.3、基于域名的nginx虚拟主机
echo "192.168.10.19 www.kgc.com www.benet.com" >> /etc/hosts
[root@nginx ~]# mkdir -p /var/www/html/benetcom #创建www.benet.com的根目录
[root@nginx ~]# mkdir -p /var/www/html/kgccom #创建www.kgc.com的根目录
[root@nginx ~]# echo "www.benet.com" >> /var/www/html/benetcom/index.html
[root@nginx ~]# echo "www.kgc.com" >> /var/www/html/kgccom/index.html
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
#删除文件中的所有server {}段,加入2个新的server{}段,对应2个域名
server { #加入www.benet.com对应的站点
listen 80;
server_name www.benet.com; #本server段域名
charset utf-8;
access_log logs/www.benett.access.log; #日志文件
location / {
root /var/www/html/benetcom; #www.bt.com的工作目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server { #加入www.kgc.com对应的站点
listen 80;
server_name www.kgc.com; #本server的域名
charset utf-8;
access_log logs/www.kgc.access.log; #日志文件
location / {
root /var/www/html/kgccom; #www.test.com的工作目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
[root@nginx ~]# nginx -t #检测配置文件的语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx ~]# systemctl restart nginx
4.4、基于IP的nginx虚拟主机
[root@nginx ~]# ifconfig ens33:0 192.168.20.128/24 #创建临时IP地址,重启网卡则失效
[root@nginx ~]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.128 netmask 255.255.255.0 broadcast 192.168.100.255
ether 00:0c:29:cd:7a:7a txqueuelen 1000 (Ethernet)
#以/var/www/html/testcom和/var/www/html/btcom,修改Nginx的配置文件,使基于IP的虚拟主机生效
server {
listen 192.168.20.15:80; #监听192.168.100.101
server_name 192.168.20.15:80;
}
server {
listen 192.168.20.128:80; #监听192.168.20.128
server_name 182.168.20.128:80;
}
[root@nginx ~]# systemctl restart nginx
4.5、基于端口的nginx虚拟主机
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 192.168.93.101:1111; #监听1111端口
server_name 192.168.93.101:1111;
}
server {
listen 192.168.93.101:8888; #监听8888端口
server_name 182.168.93.101:8888;
}
[root@nginx ~]# systemctl restart nginx
[root@nginx ~]# netstat -anpt | grep nginx
tcp 0 0 192.168.93.101:6666 0.0.0.0:* LISTEN 15190/nginx: master
tcp 0 0 192.168.93.101:8888 0.0.0.0:* LISTEN 15190/nginx: master