共计 7913 个字符,预计需要花费 20 分钟才能阅读完成。
一、Nginx 介绍
Nginx(“engine x”)是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的 Web 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。和 apache 一样,都是 web 服务器软件,因为其性能优异,所以被广大运维喜欢。又因为 nginx 是一个轻量级的 web 服务器,相比 apache 来说资源消耗更低
http://www.nginx.cn/doc/index.html 中文文档
为什么选择 nginx
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
-
作为 Web 服务器
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
-
作为负载均衡服务器
Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
-
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持 perl 语法),Bugs 非常少的服务器
Nginx 启动特别容易,并且几乎可以做到 7 *24 不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级
nginx 和 apache 对比
-
静态文件处理能力 nginx 高于 apache
-
资源消耗 nginx 优于 apache,因为 nginx 是异步处理模型,只需要几个进程就能够处理大量在线请求,而 apache 2.4 仍然是进程模型或者线程模型,即仍然采用大量线程来处理大量在线请求
-
Apache 支持的模块很多,而且也比较稳定。而 nginx 由于出现的比较晚,所以在这方面可能比不上 Apache
-
nginx 本身就是一个反向代理服务器,而且支持 7 层负载均衡
二、安装
系统版本:centOS8.1
说明:使用 root 用户安装
安装:dnf install nginx -y
路径 | 说明 |
---|---|
/etc/nginx |
配置文件目录 |
/usr/share/nginx/html |
静态网页目录 |
/var/log/nginx |
日志文件目录 |
启动服务:systemctl start nginx.service
查询是否开启自启:systemctl is-enabled nginx.service
添加开机自启:systemctl enable nginx.service
测试:浏览器输入服务器地址
三、配置详解
main
events {……}
http {
……
upstream name {……}
server {
……
location / {……}
}
}
模块 | 说明 |
---|---|
main | 全局设置 |
events | nginx 工作模式,指定 nginx 的工作模式和工作模式及连接数上限 |
http | http 服务器设置,最核心的模块,它负责 HTTP 服务器相关属性的配置,它里面含有 server 和 upstream 子模块 |
server | 主机设置,用来定一个虚拟主机 |
location | URL 匹配,是 nginx 中用的最多的,也是最重要的模块,负载均衡、反向代理、虚拟域名都与它相关 定位 URL,解析 URL,所以,它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对动、静态网页进行过滤处理 |
upstream | 负载均衡服务器设置,通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡 |
-
main 模块配置
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info; pid /run/nginx.pid; worker_rlimit_nofile 65535;
配置 说明 user 启动子进程程序默认用户 worker_processes 指定了 Nginx 要开启的子进程数。每个 Nginx 进程平均耗费 10M~12M 内存。根据经验,一般指定 1 个进程就足够了,如果是多核 CPU,建议指定和 CPU 的数量一样的进程数即可 error_log 全局错误日志的位置及日志格式 pid 指定进程 id 的存储文件位置 worker_rlimit_nofile 指定一个 nginx 进程可以打开的最多文件描述符数目,可以使用命令“ulimit -n 65535”来设置 -
日志级别
error_log 日志级别 说明 debug 调试 info 信息 notice 通知 warn 警告 error 错误 crit 严重错误 -
events 模块配置
events { use epoll; worker_connections 1024; }
配置 说明 use 指定 Nginx 的工作模式 worker_connections 定义 Nginx 每个进程的最大连接数,即接收前端的最大请求数,默认是 1024 -
io 调度模式
use 模式 说明 select 标准的工作模式 poll 标准的工作模式 kqueue 高效的工作模式,应用于 BSD 系统中 epoll 高效的工作模式,应用于 Linux 平台 最大客户端连接数计算方式:由 worker_processes 和 worker_connections 决定,即 Max_clients=worker_processes*worker_connections,在作为反向代理时,Max_clients 变为:Max_clients = worker_processes * worker_connections/4。进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后 worker_connections 的设置才能生效
-
http 模块设置
http {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; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; gzip on; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; }
-
http 模块指令
配置 | 说明 |
---|---|
include | 设定文件的 mime 类型,类型在配置文件目录下的 mime.type 文件定义,来告诉 nginx 来识别文件类型 |
default_type | 设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 asp 的 locate 环境时,Nginx 是不予解析的,此时,用浏览器访问 asp 文件就会出现下载了 |
log_format | 设置日志的格式,和记录哪些参数,这里设置为 main,刚好用于 access_log 来纪录这种类型 |
access_log | 全局访问日志路径,纪录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main |
sendfile | 指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on。如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 IO 处理速度,降低系统 uptime |
tcp_nopush | 可以减少网络报文段的数量,sendfile 为 on 时这里也应该设为 on,数据包会累积一下再一起传输,可以提高一些传输效率 |
tcp_nodelay | 小的数据包不等待直接传输,默认为 on。看上去是和 tcp_nopush 相反的功能,但是两边都为 on 时 nginx 也可以平衡这两个功能的使用 |
keepalive_timeout | 设置客户端连接保持活动的超时时间,在超过这个时间之后,服务器会关闭该连接 |
types_hash_max_size | types_hash_max_size 影响散列表的冲突率 types_hash_max_size 越大,就会消耗更多的内存,但散列 key 的冲突率会降低,检索速度就更快 types_hash_max_size 越小,消耗的内存就越小,但散列 key 的冲突率可能上升,默认为 2048 |
gzip | 使用压缩模块 |
- access_log 日志格式
log_format 部位 | 说明 |
---|---|
$remote_addr 与 $http_x_forwarded_for |
用以记录客户端的 ip 地址 |
$remote_user |
用来记录客户端用户名称 |
$time_local |
用来记录访问时间与时区 |
$request |
用来记录请求的 url 与 http 协议 |
$status |
用来记录请求状态;成功是 200 |
$body_bytes_sent |
记录发送给客户端文件主体内容大小 |
$http_referer |
用来记录从那个页面链接访问过来的 |
$http_user_agent |
记录客户浏览器的相关信息 |
-
server 模块配置
http { …… server {listen 80 default_server; listen [::]:80 default_server; server_name _; charset koi8-r; access_log /var/log/nginx/access.log main; aerror_log /var/log/nginx/error.log error; root /usr/share/nginx/html; index index.html index.htm; include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html {}} }
-
Server 配置指令
配置 说明 listen 指定虚拟主机的服务端口 server_name 指定 IP 地址或者域名,多个域名之间用空格分开 charset 虚拟主机支持的字符集 access_log 指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式 aerror_log 指定此虚拟主机的错误日志存放路径,最后的 error 用于指定访问日志的输出格式 error_page 根据错误码 返回对应的页面 root 表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {}下面定义的区分开来 index 全局定义访问的默认首页地址。注意要和 locate {}下面定义的区分开来
四、默认网站及设置
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
use epoll;
worker_connections 1024;
}
http {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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {listen 80 default_server;
listen [::]:80 default_server;
server_name _;
charset koi8-r;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
root /usr/share/nginx/html;
index index.html index.htm;
include /etc/nginx/default.d/*.conf;
location / { }
error_page 404 /404.html;
location = /40x.html { }
error_page 500 502 503 504 /50x.html;
location = /50x.html {}}
}
-
默认网站
server {listen 80 default_server; listen [::]:80 default_server; server_name _; charset koi8-r; location / { root /usr/share/nginx/html; index index.html index.htm; # 支持目录浏览 autoindex on; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html {}}
-
访问控制
mkdir /usr/share/nginx/html/a
vim /usr/hsare/nginx/html/a/home.html
<h1>sunck is a good man</h1>
server {listen 80 default_server; listen [::]:80 default_server; server_name _; charset koi8-r; location / { root /usr/share/nginx/html; index index.html index.htm; autoindex on; } location /a { autoindex on; # 基于客户端 IP 做过滤,符合条件的允许访问,不符合的禁止访问 deny 221.223.233.234; allow all; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html {}}
-
登陆验证
mkdir /usr/share/nginx/html/b
vim /usr/hsare/nginx/html/b/cart.html
dnf -y install httpd
htpasswd -cm /etc/nginx/htpasswd sunck
server {listen 80 default_server; listen [::]:80 default_server; server_name _; charset koi8-r; location / { root /usr/share/nginx/html; index index.html index.htm; autoindex on; } location /b { autoindex on; auth_basic "登陆验证"; auth_basic_user_file /etc/nginx/htpasswd; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html {}}
-
防盗链
请求目的地址,可以有两类,一个是本站的 IP 地址,这是本站的空间地址,即向本站自身请求资源,一般来说这个是必须的,访问资源由自身托管。另外一类是访问其他的网段拉取数据。这类数据不是托管站内的,是在其他站点的。浏览器在页面呈现的过程,拉取非本站的资源,这就称“盗链”
准确的说,只有某些时候,这种跨站访问资源,才被称为盗链。假设 B 站点作为一个商业网站,有很多自主版权的图片,自身展示用于商业目的。而 A 站点,希望在自己的网站上面也展示这些图片,直接使用<img src="http://b.com/photo.jpg"/>
。这样,大量的客户端在访问 A 站点时,实际上消耗了 B 站点的流量,而 A 站点却从中达成商业目的。从而不劳而获。这样的 A 站点着实令 B 站点不快的
HTTP 协议和标准的浏览器对于解决这个问题提供便利,浏览器在加载非本站的资源时,会增加一个头域,头域名字固定为Referer
。这个 referer 标签正是为了告诉请求响应者(被拉取资源的服务端),本次请求的引用页是谁,资源提供端可以分析这个引用者是否“友好”,是否允许其“引用”,对于不允许访问的引用者,可以不提供图片,这样访问者在页面上就只能看到一个图片无法加载的浏览器默认占位的警告图片,甚至服务端可以返回一个默认的提醒勿盗链的提示图片
一般的站点或者静态资源托管站点都提供防盗链的设置,也就是让服务端识别指定的 Referer,在服务端接收到请求时,通过匹配 referer 头域与配置,对于指定放行,对于其他 referer 视为盗链
注意:在 /usr/share/nginx/html 下放入一张 test.png 和一张 wdl.png 进行测试
server {listen 80 default_server;
listen [::]:80 default_server;
server_name _;
charset koi8-r;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
}
location ~* \.(gif|jpg|png|bmp)$ {# 定义白名单 none 代表直接访问的,blocked 表示被防火墙标记过的请求最后一个 > 是网址
valid_referers none blocked *.baidu.com *.google.com;
if ($invalid_referer) {# 直接返回错误码
#return 403;
# 返回一张图片,图片可以展示“勿盗链”给对方提示
rewrite ^/ http://39.107.226.105/wdl.png;
}
}
error_page 404 /404.html;
location = /40x.html { }
error_page 500 502 503 504 /50x.html;
location = /50x.html {}}
本地 HBuilder 创建服务
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>防盗链</title>
</head>
<body>
<h1>防盗链测试</h1>
<!-- 此时这里无法正常显示图片,可能是得到 403 错误,也可能返回一张勿盗链图片 -->
<img src="http://39.107.226.105/test.png" >
</body>
</html>