Nginx 基本简述
1 常见的 HTTP 服务
- Apache -> Apache 基金会
- Nginx -> 俄罗斯伊戈尔·赛索耶夫为
- IIS -> 微软
- GWS -> Google
- Openrestry ->基于 Nginx 与 Lua 的高性能 Web 平台
- tengline -> 淘宝基于 Nginx 开发
随着计算机与 Internet 技术的蓬勃发展,形形色色的 Web 站点成为直接面向用户的中坚力量。在各种网站服务器软件中,Apache HTTP Server 无疑是其中的佼佼者,Microsoft IIS 则位居其次。本章将学习另一个 Web 服务器软件——Nginx,由俄罗斯的lgor Sysoev 开发,在短短的数年内市场占有率迅速跃居第三位的轻量级、高性能的 HTTP服务器。
Nginx(发音[engine X])专为性能优发而开发,其最知明的优点是他的稳定性和低系统资源的消耗,以及对 HTTP 并发连接的高处理能力(单台物理服务器可以 30000-50000个并发连接),正因为如此,大量提供社交网站、新闻资讯、电子商务以及虚拟主机等服务的企业纷纷选择 Nginx,来提供 Web 服务,如新浪、网易、腾讯、51CTO、人人网等。根据 2018 年 11 月份的 Netcraft.com 的统计报告,Nginx 市场点有率接近 30%( 而且这个数数字正在快速上升。
Nginx 应用场景
静态处理、反向代理、负载均衡、资源缓存、安全防护、访问限制、访问认证
Nginx 优秀特性
Nginx(engine x) 是开源的一款轻量级、高性能的 HTTP 和反向代理服务。在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品,Ngin 能够支持高达 50,000 个并发连接。
Nginx 基于 IO 多路复用,IO 复用解决的是并发性的问题,Socket 作为复用, IO 多路复用的实现方式有 select、poll、epoll
**select 和epoll的区别**
select 就类似于教师去问轮流(从学号为1的同学到50号同学)去问同学 没有没问题,来帮你解决。如果某一个学生有问题 那么就停下来处理 同学的问题然后在接下去问
epoll 就类似于 教师想全部同学访问 全班同学有无问题,有问题举手,老师解决
**什么是套接字?**
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
轻量级: 功能模块少,代码模块化
CPU 亲和(affinity):将 CPU 核心和 Nginx 工作进程绑定方式,把每个 worker 进程固定在一个 cpu 上执行,减少切换 cpu 的 cache miss,获得更好的性能。
worker和CPU的核数相关 一个worker 可以处理过万的请求
相互的worker 之间不影响
Sendfile:文件传输是在内核中操作完成的, 函数直接在两个文件描述符之间传递数据, 从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝, 操作效率很高, 被称之零拷贝。
传统文件传输数据实际上是经过了四次复制操作:
硬盘—>内核 buf—>用户 buf—>socket 缓冲区(内核)—>协议引擎
用户态和内核态之间的转换叫做一次上下文的切换,经过一次上下文的切换,那么cpu就有转换一次,那么效率就低很多
这里没有用户空间和内核空间之间的切换,在内核中直接完成了从一个 buffer 到另一个buffer 的拷贝。
nginx 的安装
可以查看官方网站的 文档
链接: http://nginx.org/en/linux_packages.html#instructions.
小主的nginx安装脚本 —centos7
#!/bin/bash
<<END
19-07
BY.RALPH
centos7安装nginx
END
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
rm -rf /var/run/yum.pid
echo "installing packages !"
yum install -y lrzsz wget httpd-tools vim tree curl &> /dev/null
echo "successed!"
cat > /etc/yum.repos.d/nginx.repo << EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
rm -rf /var/run/yum.pid
yum -y install nginx
if [ $? -ne 0 ];then
echo "nginx install failed"
exit 1
else
echo "nginx install successed"
fi
nginx -v
systemctl restart nginx
nginx -s reload
nginx -t
nginx -s reload 从新加载
nginx -t 测试语法
打开浏览器认证 输入IP:
nginx中的文件模块
nginx 的常用模块:
Nginx 编译选项 | 模块作用 |
---|---|
ngx_http_core_module | 包含一些核心的 http 参数配置,对应 Nginx 的配置区块部分 |
ngx_http_access_module | 访问控制模块,用来控制网站用户对 Nginx 的访问 |
ngx_http_gzip_module | 压缩模块,对 Nginx 返回的数据压缩,属于性能优化模块 |
ngx_http_fastcgi_module | fastci 模块,和动态应用相关的模块,例如 PHP |
ngx_http_proxy_module | proxy 代理模块 |
ngx_http_upstream_module | 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查。 |
ngx_http_rewrite_module | URL 地址重写模块 |
ngx_http_limit_conn_modul | 限制用户并发连接数及请求数模块 |
ngx_http_limit_req_module | 限制 Nginx request processing rate 根据定义的key |
ngx_http_log_module | 访问日志模块,以指定的格式记录 Nginx 客户访问日志等信息 |
ngx_http_auth_basic_modul | Web 认证模块,设置 Web 用户通过账号密码访问 Nginx |
nginx_http_ssl_module ssl | 模块,用于加密的 http 连接,如 https |
Nginx 内置变量
$uri: 当前请求的 uri,不带参数
$request_uri: 请求的 uri,带完整参数
$host: http 请求报⽂中 host⾸部,如果没有则以处理此请求的虚拟主机的主机名代替
$hostname: nginx 服务运⾏在主机的主机名
$remote_addr: 客户端 IP
$remote_port: 客户端端⼝
$remote_user: 使⽤⽤户认证时客户端⽤户输⼊的⽤户名
$request_filename: ⽤户请求中的 URI 经过本地 root 或 alias 转换后映射的本地⽂件路
径
$request_method: 请求⽅法, GET POST PUT
s
e
r
v
e
r
a
d
d
r
:
服
务
器
地
server_addr: 服务器地
serveraddr:服务器地server_name: 服务器名$server_port: 服务器端⼝
$server_protocol: 服务器向客户端发送响应时的协议, 如 http/1.1 http/1.0
$scheme:在请求中使⽤scheme, 如 http://xxx.com 中的 http
$http_HEADER: 匹配请求报⽂中指定的 HEADER
$http_host: 匹配请求报⽂中的 host⾸部
$document_root: 当前请求映射到的 root 配置