文章目录
- 前言
- 1.静态网站
- 2.动态代理/反向代理
- 3.动静态分离
- 4.负载均衡
- 5.虚拟主机
- 6.防盗链
- 7.防ddos攻击
- 8.ajax跨域问题
- 9.高可用
- 10.正则表达式
前言
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其特点是占有内存少,并发能力强,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
1.静态网站
功能是返回静态资源如html、css、js、jpg等给客户端
server {
listen 80;
server_name example.com;
root /html/webroot;
location ~ (\.map|\.html|\.htm|\.css|\.js|\.jpg|\.jpeg|\.png|\.gif|\.woff|\.ttf|\.svg|\.json|\.eot|\.ico|\.swf|\.xlsx)$ {
rewrite ^/(.*)$ /$1 break;
expires 365d;
}
}
2.动态代理/反向代理
真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
反向代理通过proxy_pass指令来实现。
server {
listen 80;
server_name example.com;
root /html/webroot;
location / {
fastcgi_pass 127.0.0.1:9000; # proxy_pass http://localhost:8081;
fastcgi_index index.php;
rewrite ^/(.*)$ /index.php/$1 break;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3.动静态分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
server {
listen 80;
server_name example.com;
root /html/webroot;
location ~ (\.map|\.html|\.htm|\.css|\.js|\.jpg|\.jpeg|\.png|\.gif|\.woff|\.ttf|\.svg|\.json|\.eot|\.ico|\.swf|\.xlsx)$ {
rewrite ^/(.*)$ /$1 break;
expires 365d;
}
location / {
fastcgi_pass 127.0.0.1:9000; # proxy_pass http://localhost:8081;
fastcgi_index index.php;
rewrite ^/(.*)$ /index.php/$1 break;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
4.负载均衡
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行。
Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略,使用第三方策略需要安装第三方模块。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
#轮询(默认)
upstream test{
server localhost:8081;
server localhost:8082;
}
#权重
upstream test {
server localhost:8081 weight=1;
server localhost:8082 weight=3 backup;
}
#ip_hash
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
#fair(第三方)
upstream test {
fair;
server localhost:8080;
server localhost:8081;
}
#url_hash(第三方)
upstream test {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
5.虚拟主机
Nginx配置虚拟主机支持3种方式主要有基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置。
# 基于端口的虚拟主机配置, 配置成实际的域名,每个虚拟主机的配置文件域名都相同
server {
listen 192.168.2.154:7081;
server_name www.test.com; #访问用http://www.test.com:7081
location / {
root /data/www/port/7081;
index index.html index.htm;
}
}
server {
listen 192.168.2.154:8081; #访问用http://www.test.com:8081
server_name www.test.com;
location / {
root /data/www/port/8081;
index index.html index.htm;
}
}
# 基于ip的虚拟主机配置,可以根据不同ip访问服务器
server {
listen 192.168.2.1;
location / {
root /data/www/p1;
index index.html index.htm;
}
}
server {
listen 192.168.2.2;
location / {
root /data/www/p2;
index index.html index.htm;
}
}
# 基于域名的虚拟主机配置,可以根据不同域名访问服务器
server {
listen 80;
#server_name www.test.com;
location / {
root /data/www/test;
index index.html index.htm;
}
}
server {
listen 80;
#server_name www.test2222.com;
location / {
root /data/www/test2222;
index index.html index.htm;
}
}
6.防盗链
location ~ .*\.(jpg|jpeg|JPG|png|gif|icon)$ {
valid_referers blocked http://www.test.com www.test.com;
if ($invalid_referer) {
return 403;
}
}
7.防ddos攻击
- 限制请求次数
采用nginx提供的的ngx_http_limit_conn_module模块实现该功能。
设置连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟个请求)。
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
server {
location /login.html {
limit_req zone=one;
}
}
limit_req_zone
命令设置了一个叫one的共享内存区来存储请求状态的特定键值
$binary_remote_addr对于IPv4地址,变量的大小始终为4个字节,对于IPv6地址则为16个字节。存储状态在32位平台上始终占用32或64个字节,在64位平台上占用64个字节。一个兆字节的区域可以保持大约32000个32字节的状态或大约16000个64字节的状态。
如果区域存储耗尽,服务器会将错误返回 给所有其他请求。10M可存储160000个状态
- 限制请求速度
ngx_http_limit_req_module模块(0.7.21)用于限制每一个请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次。
键值是客户端IP。
server {
location /search/ {
limit_req zone=one burst=5; #同时允许超过频率限制的请求数不多于5个
}
}
设置共享内存区域和同时允许超过频率限制的最大请求数大小。如果请求速率超过为某个区域配置的速率,则它们的处理会延迟,从而使请求按指定速率处理。过多的请求被延迟,直到它们的数量超过最大突发大小,在这种情况下请求被终止并出现错误。
8.ajax跨域问题
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}
- Access-Control-Allow-Origin
服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *
后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。 - Access-Control-Allow-Headers 是为了防止出现以下错误:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response. 这个错误表示当前请求Content-Type的值不被支持。其实是我们发起了"application/json"的类型请求导致的。 - Access-Control-Allow-Methods 是为了防止出现以下错误:
Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
9.高可用
高可用:两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将将这个称之为高可用;
一般通过nginx+keepalived实现,部署方法这里就不说了网上有很多。
keepalived配置文件解说
keepalived脑裂现象
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。
所以需要编写一个检测nginx的存活状态的脚本,如果nginx不存活,则kill掉宕掉的nginx主机上面的keepalived。(所有的keepalived都要配置)
10.正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
这里列些常用规则
- \ 转义符。例如,“\n”匹配\n。“\n”匹配换行符。序列“\”匹配“\”而“(”则匹配“(”。
- ^ 匹配输入字行首。
- $ 匹配输入行尾。
- * 匹配前面的子表达式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于{0,}。
- + 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
- ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。?等价于{0,1}。
- {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
- {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
- {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
- . 匹配除“\n”和"\r"之外的任何单个字符。要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
- x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”(此处请谨慎)。“[zf]ood”则匹配“zood”或“food”。
- [xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
- [^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。
- [a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
- [^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
- \d 匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持
- \D 匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持
- \w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集。
- \W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
- \num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
正则使用案例
1.如果客户端使用的是IE浏览器,则重定向到/ie目录下
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}
2.禁止访问多个目录
location ~ ^/(cron|templates)/
{
deny all;
break;
}
3.禁止访问以.sh,.flv,.mp3为文件后缀名的文件
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}
4.设置某些类型文件的浏览器缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
5.设定某个文件的过期时间;这里为600秒,并不记录访问日志
location ^~ /html/scripts/loadhead_1.js {
access_log off;
root /opt/lampp/htdocs/web;
expires 600;
break;
}
6.ip白名单,只允许固定ip访问网站,并加上密码
root /opt/htdocs/www;
allow 208.97.167.194;
allow 222.33.1.2;
allow 231.152.49.4;
deny all;
auth_basic “C1G_ADMIN”;
auth_basic_user_file htpasswd;