Evernote Export
Nginx默认网站
当Nginx配置文件中有且仅有一个Server的时候,该Server就被Nginx认为是默认网站,所有发给Nginx服务器80端口的数据都会默认给server
#$开头是变量
#定义Nginx运行的用户和用户组
user work work;
#nginx进程数,建议设置为等于CPU总核心数
worker_processes auto;
#指当一个nginx进程打开的最多文件描述符数目
worker_rlimit_nofile 204800;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /opt/log/nginx/error.log error;
#工作模式及连接数上限
events {
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 102400;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#默认编码
charset utf-8;
#设定日志格式
#log_format main '$idXXXX $remote_addr $remote_user $time_local $http_host $request '
# '$status $body_bytes_sent $http_referer '
# '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $userid';
log_format main "$cookie_idXXXX $remote_addr $remote_user [$time_local] $request_method $host $request_uri "
"$request_time $status $body_bytes_sent '$http_referer' "
"'$http_user_agent' '$http_x_forwarded_for' $upstream_addr $upstream_response_time $upstream_status ";
#不可见字符分隔日志格式
#include other_log_format.conf;
#实时日志收集json格式日志
#include json_log_format.conf;
#日志流格式
log_format stream_log "$cookie_idXXXX $remote_addr $remote_user [$time_local] $request_method $host $request_uri "
"$request_time $status $body_bytes_sent '$http_referer' "
"'$http_user_agent' '$http_x_forwarded_for' $upstream_addr $upstream_response_time 3";
#成功日志
access_log /opt/log/nginx/access.log main;
#access_log syslog:local6:notice:log1.op.XXXXdns.org:514:nginx-main-log main;
#指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 60;
#服务器名称哈希表的最大值(默认512)[hash%size]
server_names_hash_max_size 1024;
#服务器名字的hash表大小
server_names_hash_bucket_size 256;
#客户请求头缓冲大小
client_header_buffer_size 4k;
#如果header过大,它会使用large_client_header_buffers来读取
large_client_header_buffers 4 256k;
client_header_timeout 1m;
client_body_timeout 1m;
send_timeout 1m;
#防止网络阻塞
tcp_nopush on;
tcp_nodelay on;
#允许客户端请求的最大单文件字节数
client_max_body_size 50m;
#缓冲区代理缓冲用户端请求的最大字节数
client_body_buffer_size 50m;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 5;
#后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 15;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 15;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_buffers 8 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
proxy_intercept_errors on;
#客户端放弃请求,nginx也放弃对后端的请求
#proxy_ignore_client_abort on;
#代理缓存头信息最大长度[设置头部哈希表的最大值,不能小于你后端服务器设置的头部总数]
proxy_headers_hash_max_size 512;
#设置头部哈希表大小(默认64)[这将限制头部字段名称的长度大小,如果你使用超过64个字符的头部名可以加大这个值。]
proxy_headers_hash_bucket_size 256;
#变量哈希表的最大值(默认值)
variables_hash_max_size 512;
#为变量哈希表制定关键字栏的大小(默认64)
variables_hash_bucket_size 128;
#开启gzip压缩输出
gzip on;
#最小压缩文件大小
gzip_min_length 1k;
#压缩缓冲区
gzip_buffers 4 16k;
#压缩等级
gzip_comp_level 9;
#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_http_version 1.0;
#压缩类型,默认就已经包含textml
gzip_types text/plain application/x-javascript application/json application/javascript text/css application/xml text/javascript image/gif image/png;
gzip_vary on;
#map模块使用
map_hash_max_size 102400;
map_hash_bucket_size 256;
#Tengine Config
#concat on;
#trim on;
#trim_css off;
#trim_js off;
server_tokens off;
#footer "<!-- $remote_addr $server_addr $upstream_addr -->";
#rewrite_log on;
fastcgi_intercept_errors on;
#include other config file
include ../conf.d/*.conf;
#包含一些特殊站点的配置文件,此目录下文件暂时不包含在git自动管理过程中
include ../special/*.conf;
#屏蔽不加主机域名的默认请求
#server {
# listen *:80 default;
# server_name _ "";
# return 444;
#}
#ceshi by dongange 2016-01-07
#Nginx状态监测模块配置
req_status_zone server "$server_name,$server_addr:$server_port" 10M;
req_status server;
server {
listen 127.0.0.1:80;
server_name 127.0.0.1;
access_log /opt/log/nginx/nginx_status/status_access.log main;
location /status {
req_status_show;
access_log /opt/log/nginx/nginx_status/status_access.log main;
allow 127.0.0.1;
deny all;
}
location /stub_status {
stub_status on;
access_log /opt/log/nginx/nginx_status_stub/status_stub_access.log main;
allow 127.0.0.1;
deny all;
}
location /check_status {
check_status;
access_log /opt/log/nginx/nginx_status_check/status_access_check.log main;
allow 127.0.0.1;
deny all;
}
}
}
log_format 变量
remote_addr 记录访问网站的客户端地址
remote_user 远程客户端用户名
time_local 记录时间与时区
request 用户的http请求起始行信息
status http状态码,记录请求返回的状态码,如201 301 401等
body_bytes_sent 服务器发送给客户端的响应body字节数
http_referer 记录此次请求是从哪个连接访问过来的,可以根据参数进行防盗链设置
http_user_agent 记录客户端访问信息,例如:手机端、浏览器等
http_x_forwarded_for 当前端有代理服务器时,设置web节点记录客户端的地址配置,此参数生效前服务器也要进行相应的x_forwarded_for配置
Nginx目录控制访问
Nginx目录验证
Nginx日志管理
log format 调用日志,综合软件可以实时分析日志展示
Nginx防盗链
防盗链的原理就是针对于请求头中的referer,不管请求是直接访问还是从第三方请求中跳转过来,服务器都会去检查请求中是否有referer,跳转过来的字段检测是否是服务器的同意的字段,防盗链是部署情况下必须做的一件事。
虚拟主机介绍
一个web服务器软件默认情况下只能发布一个web,因为一个web分享出去需要三个条件(IP、Port、Domain name)
一个web服务器软件如何发布多个web呢?
虚拟主机:就是把一个服务器划分为多个虚拟服务器,每一个虚拟主机都有可以独立的域名和独立的目录
基于IP的虚拟主机
#第一个虚拟主机
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
#第二个虚拟主机
server {
listen 192.168.1.220:80;
server_name localhost;
location / {
root /website/baseip;
index index.html index.htm;
}
}
基于端口的虚拟主机
#第一个虚拟主机
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
#第二个虚拟主机
server {
listen 8080;
server_name localhost;
location / {
root /website/port;
index index.html index.htm;
}
}
基于域名的虚拟主机
#第一个虚拟主机
server {
listen 80;
server_name mail.ycdata.net;
location / {
root html;
index index.html index.htm;
}
#第二个虚拟主机
server {
listen 80;
server_name bbs.ycdata.net;
location / {
root /website/baseport;
index index.html index.htm;
}
}
Nginx反向代理
反向代理介绍
在内网里设置代理服务器,在访问的时候就直接将网址的内容设置在代理服务器上,这是正向代理,代理对象是用户
代理的对象是服务器就是反向代理
代理服务器,客户机在发送请求的时候,不会直接发送给目的主机,而是先发给代理服务器,代理服务器接收客户机的请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发给客户机。
应用场景
堡垒机场景-安全配置只接受来自堡垒机的请求访问,其他都拒绝
内网服务器发布场景
缓存场景
反向代理原理
1.客户端通过浏览器发起请求-代理服务器
2.代理服务器-接收请求
3.代理服务器-发起请求-业务服务器
4.业务服务器-接收请求
5.业务服务器-处理请求
6.业务服务器-响应请求-代理服务器
7.代理服务器-响应请求-客户端
8.客户端通过浏览器渲染并展示给用户
反向代理实现
Nginx限速
1.限速介绍
限速该特性可以限制某个用户在一个给定的时间段内能够产生的HTTP请求数。请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求。
限速也可以用于安全目的上,比如密码暴力破解攻击。通过限制进来的请求速率,并且(结合日志)标记出目标URLs来帮助防范DDos攻击。一般来说,限流是用在保护上游应用服务器不被在同一时刻的大量用户请求湮没。
2.应用场景
DDos攻击防范
下载限速
3.限速原理
算法原理:
水(请求)从上方倒出,从水桶下方流出(被处理)
来不及流出的水存在水桶中(缓存),以固定的速率流出
水桶满水后溢出(丢弃)
这个算法的核心是:缓存请求、匀速处理,多余的请求被丢弃
4.限速实现
url重写
1.URL重写介绍
rewrite模块
Rewrite模块功能是Nginx服务器提供的一个重要的功能,几乎是所有的web产品的必备技能,用于实现URL重写。URL重写是非常实用的功能,比如在我们改变网络结构以后,不需要客户端修改原来的书签,也不需要其他网站修改我们对网站的友情链接,还可以在一定程度上提高网站的安全性,能够让网站显得更专业。
Nginx服务器rewrite功能的实现是依赖于PCRE(Perl Compatiable Regular Expression.Perl兼容的正则表达式)
所以在Nginx编译安装之前,需要安装PCRE库
2.应用场景
域名变更(京东)
用户跳转(从某一个连接跳转到另一个连接)
伪静态场景(便于CDN缓存动态页面数据)
URL语法
1.set 设置变量
2.if 负责语句中的判断
3.return 返回返回值或URL
4.break 终止后续的rewrite规则
5.rewrite 重定向URL
注意:重定向就是将网页自动转向重定向
301永久性重定向:新网址完全继承旧网址,旧网址的排名完全清零
301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301做转址
302临时性重定向:对旧网址没有影响,但是新网址不会有排名
搜索引擎会抓取新的内容而保留旧的地址
3.URL重写原理
4.URL重写实现
优化
优化的目的
标准情况下,软件默认的参数都是对安装软件的硬件标准来设置的,目前我们服务器的硬件资源远远大于要求的标准,所以为了让服务器性能更加出众,充分利用服务器的硬件资源,我们一般都需要优化APP的并发数来提升服务器的性能。
1.优化思路
2.工作进程优化
主要是为了大并发的实现
3.长连接
主要是为了减少三次握手和四次挥手的资源访问
4.压缩优化
减少带宽的成本,让用户尽快拿到数据
5.客户端缓存优化
客户端从本地拿取数据