一、Nginx介绍
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。和apache一样,都是web服务器软件,因为其性能优异,所以被广大运维喜欢。又因为nginx是一个轻量级的web服务器,相比apache来说资源消耗更低
http://nginx.org 官网
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
测试:浏览器输入服务器地址
三、配置详解
代码语言:javascript复制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模块配置
代码语言:javascript复制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模块配置
代码语言:javascript复制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模块设置
代码语言:javascript复制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模块配置
代码语言:javascript复制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 {}下面定义的区分开来 |
四、默认网站及设置
代码语言:javascript复制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 {
}
}
}
默认网站
代码语言:javascript复制 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>
代码语言:javascript复制 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进行测试
代码语言:javascript复制 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创建服务
代码语言:javascript复制<!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>