nginx基础
1为什么Nginx总体性能比 Apache 高?
Nginx 使用最新的 epoll(Linux2.6内核)和kqueue(freebsd)异步网络 I/O 模型,而 Apache 则使用的是传统的 select 模型目前 Linux下能够承受高并发访问的Squid、Memcached 软件都采用的是 epol 模型。
处理大量连接的读写,Apache所采用的select网络 I/O 模型比较低效。下面用两个通俗的的比喻来解释 Apache 采用的 select模型和 Nginx采用的 epoll 模型之间的区别。
第一个比喻:
select 版宿管大妈就会带着假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。你的朋友挨个房间去找,直到找到你为止。而epo版宿管大妈会先记下每位入住同学的房间号,你的朋友来找你时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满宿舍楼找人了如果同时来了100个人,都要找自己住这栋楼的同学时,select版和 epoll版宿管大妈,谁的效率更高,就很明显了。
第二个比喻:
select 的调用复杂度是线性的,即 O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络 I/O 事件,select的作用就好比这个保姆挨个询问每个孩子:你要尿尿吗?如果孩子回答是,保姆则把孩子领出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些要尿尿的孩
子去上厕所(处理网络I/O事件)。
还是以保姆照看一群孩子为例,在epo!机制下,保姆不再需要挨个的询问每个孩子是否需要尿尿。取而代之的是,每个孩子如果自己需要尿尿的时候,自己主动的站到事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去上厕所(网络事件处理)因此,epoll 的这种机制,能够高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多。
nginx vs apache web服务
nginx处理请求(事务)模型是 epoll 异步模型
apache处理请求(事务)模型是select 同步模型
Nginx 的重要特性
Nginx 在诞生之初的功能较弱,近几年各种功能特性逐渐增多并日趋成熟,很多大型网站也写了些功能模块并开源出来,这使得Nginx变得越来越强大了。Nginx具备如下基本特性:
- 可针对静态资源高速高并发访问及缓存;
- 可使用反向代理加速,并且可进行数据缓存
- 具有简单负载均衡、节点健康检查和容错功能:
- 支持远程 FastCGI服务的缓存加速;←
- 支持 FastCGI、Uwsgi、SCGI、and Memcached Servers 的加速和缓存;
- 支持 SSL、TLS、SNI:
- 具有模块化的架构:过滤器包括 gzip 压缩、ranges 支持、chunked 响应、XSLT、SSI及图像缩放等功能。在SSI过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。
它所具备的其他 WWW 服务特性如下:
- 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)资源消耗少:
- 在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
- 可以做 HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的haproxy软件或lvs的功能。
- 具备squid 等专业缓存软件等的缓存功能。
- 支持异步网络 IO 事件模型 epoll (Linux 2.6+)。
下载和安装
下载地址:http://nginx.org/en/download.html
sudo yum install yum-utils vim /etc/yum.repos.d/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 yum repolist yum list |grep nginx sudo yum-config-manager --enable nginx-mainline sudo yum install nginx
nginx目录结构
systemctl start nginx
systemctl enable nginx
ss -lntup |grep nginx
nginx配置文件:
nginx虚拟主机功能
server { listen 80; server_name game.oldboylinux.cn; location / { root /app/code/game; index index.html; } } server { listen 80; server_name video.oldboylinux.cn; location / { root /app/code/video; index index.html; } } server { listen 80; server_name www.oldboylinux.cn; location / { root /app/code/www; index index.html; } }
修改了windows修改hosts文件: 10.0.0.7 www.oldboylinux.cn game.oldboylinux.cn video.oldboylinux.cn
nginx -t
systemctl reload nginx
server { listen 8888; server_name game.oldboylinux.cn; location / { root /app/code/game; index index.html; } }
[root@web01 /etc/nginx/conf.d]# cat game.oldboylinux.cn.conf server { listen 172.16.1.7:8848; #web01的ip地址. server_name game.oldboylinux.cn; location / { root /app/code/game; index index.html; } } [root@web01 /etc/nginx/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@web01 /etc/nginx/conf.d]# systemctl reload nginx [root@web01 /etc/nginx/conf.d]# ss -lntup |grep nginx 16 tcp LISTEN 0 128 172.16.1.7:8848 *:* users: (("nginx",pid=3558,fd=11),("nginx",pid=1466,fd=11)) 17 tcp LISTEN 0 128 *:80 *:* users: (("nginx",pid=3558,fd=6),("nginx",pid=1466,fd=6))
核心模块:
[root@web01 ~]# nginx -V 查看nginx编译参数 ./configure参数,间接告诉我们nginx模块. nginx version: nginx/1.20.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled
日志概述
access.log 访问日志.
error.log 错误日志.
log_format
|
|
Syntax(语法):
|
log_format 格式名字 string要求的格式
|
Default(默认):
|
Log_format combined
#不推荐默认的格式,内容少。 |
Context(放哪):
|
http 只能在http{}里面.
|
access_log指令
|
|
语法:
|
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
|
默认值:
|
access_log logs/access.log combined;
|
放哪:
|
http , server , location , if in location , limit_except
|
方法01 : 关闭访问日志. access_log off; 内部使用,检查nginx状态.
方法02 : 对于用户访问,开启日志. access_log 路径/名字 格式名字;
[root@web01 /etc/nginx/conf.d]# cat www.oldboylinux.cn.conf server { listen 80; server_name www.oldboylinux.cn; access_log /var/log/nginx/www.oldboylinux.cnaccess.log main buffer=128k flush=5s; location / { root /app/code/www; index index.html; } }
[root@web01 /etc/nginx/conf.d]# cat www.oldboylinux.cn.conf server { listen 80; server_name www.oldboylinux.cn; access_log /var/log/nginx/www.oldboylinux.cnaccess.log main ; location / { root /app/code/www; index index.html; } } [root@web01 /etc/nginx/conf.d]# cat game.oldboylinux.cn.conf server { listen 80; server_name game.oldboylinux.cn; access_log /var/log/nginx/game.oldboylinux.cnaccess.log main ; location / { root /app/code/game; index index.html; } } [root@web01 /etc/nginx/conf.d]# cat video.oldboylinux.cn.conf server { listen 80; server_name video.oldboylinux.cn; access_log /var/log/nginx/video.oldboylinux.cnaccess.log main ; location / { root /app/code/video; index index.html; } } nginx -t systemctl reload nginx
每个网站有这自己独立的错误日志即可. error_log /var/log/nginx/www.oldboylinux.cnerror.log notice;
[root@web01 /etc/nginx/conf.d]# cat www.oldboylinux.cn.conf server { listen 80; server_name www.oldboylinux.cn; access_log /var/log/nginx/www.oldboylinux.cnaccess.log main ; error_log /var/log/nginx/www.oldboylinux.cnerror.log notice; location / { root /app/code/www; index index.html; } } [root@web01 /etc/nginx/conf.d]# cat game.oldboylinux.cn.conf server { listen 80; server_name game.oldboylinux.cn; access_log /var/log/nginx/game.oldboylinux.cnaccess.log main ; error_log /var/log/nginx/game.oldboylinux.cnerror.log notice; location / { root /app/code/game; index index.html; } } [root@web01 /etc/nginx/conf.d]# cat video.oldboylinux.cn.conf server { listen 80; server_name video.oldboylinux.cn; access_log /var/log/nginx/video.oldboylinux.cnaccess.log main ; error_log /var/log/nginx/video.oldboylinux.cnerror.log notice; location / { root /app/code/video; index index.html; } } nginx -t systemctl reload nginx
- 防止单个日志过大而定期对文件切割.
- 方法01:通过系统配置即可logrotate命令+定时任务.
- 方法02:手动mv日志,重启服务+定时任务.
logrotate 是一个 Bash 的 SHELL 脚本,可对日志文件进行切分,并将切分后的日志放在统一目录。
目录列表模块
[root@web01 /etc/nginx/conf.d]# cat
dl.oldboylinux.cn.conf
server {
listen 80;
server_name dl.oldboylinux.cn;
root /app/code/dl;
access_log /var/log/nginx/dl.oldboylinux.cnaccess.log main;
error_log /var/log/nginx/dl.oldboylinux.cnerror.log notice;
autoindex on;
autoindex_localtime on;
location / {
index index.html;
}
}
server { listen 80; server_name status.oldboylinux.cn; #allow 172.16.1.0/24; #deny all; stub_status; }
Active connections: 65 server accepts handled requests 190 190 2626 Reading: 0 Writing: 1 Waiting: 64
访问限制-alow-deny
ngx_http_access_module
访问限制模块
- allow准许 某个ip或网段访问
- deny 拒绝
server { listen 80; server_name dl.oldboylinux.cn; root /app/code/dl; access_log /var/log/nginx/dl.oldboylinux.cnaccess.log main; error_log /var/log/nginx/dl.oldboylinux.cnerror.log notice; #网站列表功能 autoindex on; autoindex_localtime on; #网站认证功能 #auth_basic "input password"; #auth_basic_user_file /etc/nginx/key/pass; #屏蔽某个ip地址 #deny 10.0.0.1; #屏蔽网段 deny 10.0.0.0/24; location / { index index.html; } }
- allow 10.0.0.1;
- allow 172.16.1.0/24;
- deny all; #拒绝所有.
server { listen 80; server_name dl.oldboylinux.cn; root /app/code/dl; access_log /var/log/nginx/dl.oldboylinux.cnaccess.log main; error_log /var/log/nginx/dl.oldboylinux.cnerror.log notice; #网站列表功能 autoindex on; autoindex_localtime on; #网站认证功能 #auth_basic "input password"; #auth_basic_user_file /etc/nginx/key/pass; #黑名单 #屏蔽某个ip地址 #deny 10.0.0.1; #屏蔽网段 #deny 10.0.0.0/24; #白名单 allow 10.0.0.1; allow 172.16.1.0/24; deny all; location / { index index.html; }
auth_basic模块
1.创建密码文件 htpasswd 生成密码文件 yum install httpd-tools a) 添加及创建密码文件 [root@web01 /etc/nginx/conf.d]# htpasswd -bc /etc/nginx/key/pass oldboy 1 #Adding password for user oldboy b) 增加用户 [root@web01 /etc/nginx/conf.d]# htpasswd -b /etc/nginx/key/pass lidao 1 Adding password for user lidao [root@web01 /etc/nginx/conf.d]# cat /etc/nginx/key/pass oldboy:$apr1$QfnPt6V.$yPoX0tfzBhhoOoZaOS.fU1 lidao:$apr1$VCseQ.WK$87O9KzY/.19nCUZAZtnIF. c) 修改密码文件权限600 [root@web01 /etc/nginx/conf.d]# chmod 600 /etc/nginx/key/pass [root@web01 /etc/nginx/conf.d]# ll /etc/nginx/key/pass -rw------- 1 root root 89 Apr 20 12:23 /etc/nginx/key/pass 2. 修改配置文件. [root@web01 /etc/nginx/conf.d]# cat server { listen 80; server_name dl.oldboylinux.cn; root /app/code/dl; access_log /var/log/nginx/dl.oldboylinux.cn access.log main; error_log /var/log/nginx/dl.oldboylinux.cn error.log notice; #网站列表功能 autoindex on; autoindex_localtime on; #网站认证功能 auth_basic "input password"; auth_basic_user_file /etc/nginx/key/pass; location / { index index.html; } }
给网站或某个uri增加认证功能
进阶版本:仅对于ssssvip-si目录进行认证. [root@web01 /etc/nginx/conf.d]# cat dl.oldboylinux.cn.conf server { listen 80; server_name dl.oldboylinux.cn; root /app/code/dl; access_log /var/log/nginx/dl.oldboylinux.cn access.log main; error_log /var/log/nginx/dl.oldboylinux.cn error.log notice; #网站列表功能 autoindex on; autoindex_localtime on; #网站认证功能 location / { index index.html; } location /ssssvip-si { #这个配置是,只有用户访问/ssssvip-si uri的时候才会提示认证. auth_basic "input password"; auth_basic_user_file /etc/nginx/key/pass } }
各种限制模块
- ·limit_req 模块 限制请求(http)
- ·limit_conn 模块 限制连接(tcp)
- limit_rate core模块 限速速度
- 。请求的限制
limit_req 请求限制模块
http { 1imit_req_zone $binary_remote_addr zone=one:l0m rate=lr/s; #$binaryIremote_addr 用户ip地址, 占用空间更少 #zone=one:10m 指定空间名字:大小 #rate=lr/s 指定木桶处理速度 } #补充:客户端IP地址用作密钥。请注意,这里使用的不是$remote_addr,而是$binary_remote_addr变量。$binary_remote_addr变量的大小对于IPV4地址总是4字节,对于IPV6地址总是16字节
limit_req zone=one burst=5; zone=one #指定limit_req_zone 创建的木桶空间 burst=5#并发5 limit_reg_zone $binary_remote_addr zone=one:10m rate=1r/s, server { location /search/ { limit_reg zone=one burst=5, } ...... } # allow not more than l request per second at an average, with bursts notexceeding 5 requests. #平均每秒允许不超过1个请求,突发请求不超过5个。 limit_reg_zone $binary_remote_addr zone=one:10m rate=1r/s, server { location /search/ { limit_reg zone=one burst=5 nodelay, } ...... } #nodelay #默认不加上nodelay,超过并发数后,排队(delay) #nodelay超过并发数后,报错
limit_conn 连接数限制模块
ngx_http_limit_conn模块用于限制每个已定义密钥的连接数,特别是来自单个IP地址的连接数。并非所有连接都被计算在内。只有当一个连接有一个正在由服务器处理的请求并且整个请求头已经被读取时,它才会被计数。
3)limit rate 速率限制
- limit_rate 限速 I
- ·limit_rate_after 下载多少文件后再进行限速
官网更多模块讲解:http://nginx.org/en/docs/
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/18199538