nginx的配置
|
所属 |
功能 |
参数名称 |
参数说明 |
|
Main 区 |
核心功能模块core-function |
daemon off; |
前台运行 |
|
user nginx; |
防黑改为特殊用户 |
||
|
worker_processes auto; |
进程数量 |
||
|
error_log logs/error.log; |
错误日志 |
||
|
pid logs/nginx.pid; |
pid文件位置 |
||
|
Events区 |
核心功能模块 |
events { use epoll; worker_comnections 1024; } http:nginx.org/en/docs/ngx_core_module.html(参) |
每个worker进程支持的最大连接数 1024:ulimit -HSn 执行结果 |
|
Nginx作Web服务器负载均衡、Squid、Nginx反向代理后不能取到客户端的真实IP 原因:由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP 通过$remote_addr变量拿到的将是反向代理服务器的IP 。 但是,反向代理服务器在转发请求的HTTP头信息中,增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。 |
|||
|
|
|
||
|
|
|
||
|
Http 核 心 模 块 区
Http 核 心 模 块 区
Http 核 心 模 块 区
Http 核 心 模 块 区
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"'; |
|
|
解释: $remote_addr和$http_x_forwarded_for用于记录IP地址; $remote_user用于记录远程客户端用户名称; $time_local用于记录访问时间与时区; $request用于记录请求URL与HTTP协议; $status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404; $body_bytes_sent用于记录发送客户端的文件主体内容大小; $http_referer用于记录是从哪个页面链接访问过来的; $http_user_agent用于记录客户浏览器的相关信息。 |
$ssl_protocol SSL协议版本 $ssl_cipher 交换数据中的算法 $upstream_addr 后台upstream的地址 $request_time 整个请求的总时间 $upstream_response_time 请求过程中,upstream响应时间 |
||
|
常规参数 |
include mime.types; |
文件扩展名与类型映射表 |
|
|
default_type application/octet-stream; |
默认文件类型 |
||
|
sever_tokens off; |
隐藏版本号信息 |
||
|
clie_max_body_size 10m; |
设置上传文件大小 |
||
|
access_log off; |
关闭访问日志 |
||
|
imit模块 |
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_conn_zone $binary_remote_addr zone=addr:10m; |
|
|
|
|
可防范一定量的DDOS攻击#用来存储session会话的状态,例:是为session分配一个名为one的10M的内存存储区,限制了每秒只接受一个ip的一次请求 1r/s |
||
|
|
|
|
|
|
sendfile on; 高效传输 |
sendfile on; |
高效传输 |
|
|
tcp_nopush on; (选项对于www,ftp等大文件传输、文件服务器) |
解决网络和磁盘IO阻塞tcp_crok |
||
|
#tcp_nodelay on; (upstream发送响应到客户端时会启用) |
解决网络和磁盘IO阻塞 立即发送 |
||
|
|
发送一系列当作单一消息的数据之前设置TCP_CORK,而在发送应立即发出的短消息之前设置TCP_NODELAY。 如需要提供网络的传输效率,应该减少小包的传输,使用TCP_CORK来做汇总传输,在利用sendfile来提高效率; 但如果是交互性的业务,那应该让任意小包可以快速传输,关闭Nagle算法,提高包的传输效率。 TCP_CORK优化了传输的bits效率,tcp_nodelay优化了传输的packet效率。 |
||
|
设定请求缓存 |
server_names_hash_bucket_size 128; |
|
|
|
server_names_hash_max_size 512; |
|
||
|
client_header_buffer_size 512k; |
|
||
|
large_client_header_buffers 4 512k; |
|
||
|
|
|
|
|
|
超时链接 |
keepalived_timeout 60; |
保护系统资源;减少维护成本 防止恶意攻击;lnmp中常用 |
|
|
client_header_timeout 15; |
设置读取客户端请求头数据的超时时间 |
||
|
client_body_timeout 15; |
设置读取客户端请求主体的超时时间 |
||
|
send_timeout 25: |
用户指定响应客户端的超时时间;仅仅为两次成功握手后的一个超时 |
||
|
Nginx_Fastcgi(配合PHP引擎动态服务) |
|
||
|
Nginx _Fastcgi 配 合 PHP 引 擎 动 态 服 务 |
fastcgi_connect_timeout |
|
|
|
表示nginx服务器和后端FastCGI服务器连接的超时时间,默认值为60s,这个参数通常不要超过75s,因为建立的连接越多消耗的资源就越多 |
|||
|
fastcgi_send_timeout; |
|
||
|
设置nginx允许FastCGI服务返回数据的超时时间,即在规定时间之内后端服务器必须传完所有的数据,否则,nginx将断开这个连接,默认值为60s |
|||
|
fastcgi_read_timrout |
|
||
|
设置Nginx从FastCGI服务端读取响应信息的超时时间。表示建立连接成功后,nginx等待后端服务器的响应时间,是nginx已经进入后端的排队之中等候处理的时间 |
|||
|
fastcgi_buffer_size |
|
||
|
这是nginx fastcgi的缓冲区大小参数,设定用来读取FastCGI服务端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会包含一个小的响应头部,默认情况,这个参数大小是由fastcgi_buffers指定的一个缓冲区的大小 |
|||
|
fastcgi_buffers |
|
||
|
读取FastCGI服务端收到响应信息的缓冲区大小数量;默认值fastcgi_buffers 8 4|8k; PHP脚本产生页面256lb,分配4个64kb的缓存区;脚本所产生的页面256kb值设为“16 16k”、“4 64k”等 |
|||
|
fastcgi_busy_buffers_size |
|
||
|
设置系统忙时使用fastcgi_buffers大小,官方推荐fastcgi_buffers*2;默认fastcgi_busy_buffers_size 8k|16k |
|||
|
fastcgi_temp_file_write_size |
|
||
|
fastcgi临时文件的大小,可设置128-256k |
|||
|
fastcgi_cache oldboy_nginx |
|
||
|
表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,有效降低CPU的负载,并且防止502但是开启缓存也会引起其他问题,要根据具体情况选择 |
|||
|
fastcgi_cache_path 示例:fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zong=nginx_fcgi_cache:512m inavtive=1d max_size=40g; |
|
||
|
fastcgi_cache缓存目录,可以设置目录哈希层级。比如2:2会生成256*256个子目录,keys_zene是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放入内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先卸载fastcgi_temp_path再移到fastcgi_cache_path。所以这两个目录最好在同一个分区 |
|||
|
fastcgi_cache_vaild 示例:fastcgi_cache_valid 2000 302 1h; 示例:fastcgi_cache_valid 301 1d; |
|
||
|
用来指定应答代码的缓存时间,实例中的值将2000和302应答缓存一个小时 将304应该缓存1天;还可以设置缓存1分钟(1m) |
|||
|
fastcgi_cache_min_user 示例:fastcgi_cache_min_user 1; |
设置请求几次之后响应将被缓存。 |
||
|
fastcgi_cache_user_stale 示例:fastcgi_cache_use_stale error timeout invaild_header http_500; |
定义那些情况下用过期缓存 |
||
|
fastcgi_cache_key 示例:fastcgi_cache_key $request_method://$host$request_uri; |
|
||
|
|
定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取响应的位置作为目录。注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空 |
||
|
gzip |
gzip on; |
压缩功能依赖ngx_http_gzip_module |
|
|
gzip_min_length 1k; |
|
||
|
设置允许要锁的页面最小字节数,页面字节数从header头的content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置1k不然越压越大 |
|||
|
gzip_buffers 4 16k |
|
||
|
压缩缓冲区大小,申请4各单位为16k的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果 |
|||
|
gzip_http_version 1.1; |
识别http版本协议 默认即可 |
||
|
gzip_comp_level 2; |
|
||
|
1压缩比最小、处理速度最快,9压缩比最大、处理最慢,传输速度最快、CPU消耗最多。 |
|||
|
gzip_types text/css text/xml application/javascripts; |
指定压缩类型,'text/html'总被压缩的媒体类型 |
||
|
gzip_vary on; |
让前端的缓存服务器缓存经过Gzip压缩的页面 |
||
|
|
gzip_disable “MSIE [1-6].” |
是用正则表达式来指定某些不需要gzip压缩的浏览器;禁止IE浏览器的1-6进行压缩 |
|
|
upstream模 块 |
upstream backend_server { server 10.254.244.20:81 weight=1 max_fails=2 fail_timeout=30s; server 10.254.242.40:81 weight=1 max_fails=2 fail_timeout=30s; }
#设置由 fail_timeout 定义的时间段内连接该主机的失败次数,以此来断定 fail_timeout 定义的时间段内该主机是否可用。默认情况下这个数值设置为 1。零值的话禁用这个数量的尝试。 #设置在指定时间内连接到主机的失败次数,超过该次数该主机被认为不可用。 #这里是在30s内尝试2次失败即认为主机不可用 |
||
|
|
Include ../module/*.conf |
引用当前目录的上级目录module下基于域名的的配置文件 |
||||
|
Nginx安全与优化 |
||||||
|
结 构 与 参 数 |
server区 |
基于域名的虚拟主机 |
|
|||
|
server 结 构 |
server { listen 80: server_name www.xxx.com; |
提供服务器的端口,默认80 提供服务器的域名主机名 |
||||
|
index index.html index.htm index.php; |
首页排序 |
|||||
|
root /data0/abc; # root /usr/local/tomcat/ROOT/ |
站点根目录 |
|||||
|
|
error_page 500 502 404 /templates/kumi/phpcms/404.html; |
错误页面 |
||||
|
伪 静 态 |
location / { root D:/phpweb/wwwroot; index index.php index.html index.htm; rewrite ^(.*)/t(\d+)\.html$ $1/index.php?t=3 last; } |
要将http://dede.com/index.php?t=3用伪静态规则改写成http://dede.com/t3.html |
||||
|
仔细观察 rewrite ^(.*)/t(\d+)\.html$ $1/index.php?t=3 last;其实感觉nginx的伪静态规则蛮好写的。就是用正则的基础上,一个rewrite来声明,然后^是伪静态规则开头,(.*)匹配任意字符,这里匹配的就是域名了,t就是你在这里想加的字符,如你可以加apple、orange这样的分类名了,(\d+)匹配的是数字,\.html匹配的是后缀,$就是正则匹配的结束。后面半部分就是要改写的url了,用$1打头,表示域名,/index.php?t=3就是要改写的URL,用last;结束即可。 |
||||||
|
指定路径禁止访问 |
location ~ /.svn/ { deny all; } |
|||||
|
增加缓存 |
location~ .*\.(js|css)?$ { expires 30d; #客户端缓存上述js,css数据30天 } |
|||||
|
指 定 文 件 抛 给 fastcgi |
location ~ /.svn/ { |
|||||
|
统 计 PV |
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)?$ { access_log off; } |
|||||
|
于负载均衡器健康检查节点或某些特定文件(比如图片、js、css)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的。而且日志写入频繁会大量消耗磁盘I/O,降低服务的性能。 |
||||||
|
Nginx 站 点 目 录 及 文 件 URL 访 问 控 制 |
防 止 木 马 程 序 解 析 |
location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ { deny all; } location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$ { deny all; } location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ { deny all; |
禁止访问上传资源目录下的PHP、shell、perl、Python程序文件,这样用户即使上传了木马文件也没法去执行,从而加强了网站的安全。 |
|||
|
禁 止 访 问 重 要 文 件 |
location ~*\.(txt|doc)${ if (-f $request_filename) { root /data/www/www; #rewrite ....可以重定向某个URL break; } } location ~*\.(txt|doc)${ root /data/www/www; deny all; } |
nginx下配置禁止访问*.txt对上述限制需要写在php匹配的前面
location ~.*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000 fastcgi_index index.php include fcgi.conf; } |
||||
|
限制网站来源IP访问 |
location ~ ^/docker/ { allow 202.111.12.211; deny all; } |
禁止某目录让外界访问,但允许某IP访问该目录,切支持PHP解析 |
||||
|
限 制 客 户 端 ip |
方法1:使用if来控制。 if ( $remote_addr = 10.0.0.7 ) { return 403; } if ( $remote_addr = 218.247.17.130 ) { set $allow_access_root 'true'; } |
|
||||
|
过滤只允许GET,HEAD和POST方法请求 |
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } |
|
||||
|
阻止User-Agents,如扫描器,机器人以及滥用你服务器的垃圾邮件发送者 |
if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 405; } |
|
||||
|
防范小流量的攻击,客户端的IP对一个页面进行不停地访问,没有记录浏览器的信息 |
if ( $http_user_agent ~* "Windows 5.1" ) { return 445; } |
根据官方文档的介绍“非http标准的返回码444,它可以用来关闭连接”,这样的话他就不会占用我们服务器的任何资源,这三个4真是把访问杀得很彻底 |
||||
|
禁 止 访 问 目 录 |
单目录 location ~ ^/(static)/ { deny all; } 多目录 location ~ ^/static { deny all; } |
禁止访问目录并返回指定的http状态码 location /admin/ { return 404; } location /templates/ { return 403; } |
||||
|
Nginx禁止非法域名解析访问企业网站 |
server { listen 80 default_server; server_name _; return 501; } |
让使用IP访问的网站用户,或者而已解析域名的用户,收到501错误 |
||||
|
或:通过301跳转到主页 |
301-rewrite跳转到公司网站 要放在第一个server if ($host !~ ^www/.oldboy123/.com$){ rewrite ^(.*) http://www.oldboy123.com$1 permanent; } |
|||||
|
server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.oldboy123.com/$1 permanent; } |
||||||
|
Nginx 图 片 及 目 录 防 盗 链 解 决 方 案 |
防盗链 HTTP Refere
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
#--> $http_referer |
在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示哪里的链接用了当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上进行阻止或返回指定的页面。 |
|||
|
流量类 |
<script>document.cookie="Cache=av;domain.com;path=/";</script> |
|
||||
|
对于视频这种占用流量较大的业务根据实现防盗链是比较困难的,此时可以采用Cookie技术,来解决对Flash、Windows Media视频等防盗链问题。 Active X插件不传递Referer,但会传递Cookie。可以在显示Active X的页面的 标签内嵌入一段代码,可以用JavaScript 代码来设置一段Cookie;Cache=av; 然后就可以通过各种手段来判断这个Cookie的存在以及验证其值的操作了 |
||||||
|
下载类
|
<?php $secret = "oldboy"; //加密字符串与lighttpd.conf一致 $uri_prefix = "mp4"; //虚拟路径、前缀与lighttpd.conf一致 $file = "/test.mp4"; //实际文件名,必须加"/"斜杠 $timestamp = time(); //current timestamp $t_hex = $spcintf("%08%x",$timestamp); $m = md5($secret.$file.$t_hex); printf('%s',$uri_prefix,$m,$t_hex, $file,$file); //生成url地址串 ?> |
下载类业务的网站 通过加密变换访问路径 |
||||
|
|
此方法比较适合视频以及下载类业务的网站。例如:Lighttpd 有类似的插件mod_secdownload来实现此功能,现在服务器配置此模块,设置一个固定用于加密的字符串比如oldboy123,然后设置一个url前缀,比如/abc/,再设置一个过期时间,比如1小时,然后写一段PHP代码,例如加密字符串和系统时间等通过md5算法生产一个加密字符串,最终获取到的文件的URL连接种会带由一个时间戳和一个加密字符的md5数值,在访问时系统会对这两个数据进行验证。如果时间不在预期的时间段内(如1小时)则失效;如果时间戳符合条件,但是加密的字符串不符合条件也失效,从而达到防盗链的效果。 |
|||||
|
|
http://nginx.org/en/docs/http/ngx_http_secure_link_module.html |
ngx_http_secure_link_module 防盗链模 |
||||
|
产品设计 |
加水印加版权 |
|
||||
|
nginx防盗链 |
location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked *.oldboy123.org oldboy123.org; if ($invalid_referer) { rewrite ^/ http://bbs.oldboy123.org/img/nolink.gif; } root html/www; } |
|
||||
|
利用referer并且针对扩展名rewrite重定向 提示:要根据主机公司实际业务(是否有外联的合作),进行域名设置。 |
||||||
|
|
|
|
|
|||
|
404 错 误 页 面 优 化 显 示 |
优雅404
|
server { listen 80; server_name www.etiantian.org; location / { root html/www; index index.php index.html index.htm; error_page 404 /404.html #当页面出现404错误时,会跳转404.html页面显示给用户 } |
对错误代码404实行本地页面优雅显示 |
|||
|
重定向 |
另一种 重定向到一个地址 error_page 404 http://www.oldboy123.com; #error_page 404 /404.html; error_page 404 http://www.oldboy123.com; 可以写多行。 error_page 404 /404.html; error_page 500 502 503 504 /50x.html;
阿里门户网站天猫的Nginx优雅显示配置案例如下: error_page 500 501 502 503 504 http://err.tmall.com/error2.html; error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html; |
对错误代码404实行本地页面重定向 |
||||
|
|
|
|
|
|||
|
Nginx 防 爬 虫 |
user-agents |
## Block download agents ## location ~^/(images)/ { if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } } |
我们可以根据客户端的user-agents信息,轻松地阻止爬虫取我们的网站防爬虫 |
|||
|
|
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") { return 403; } |
添加内容防止N多爬虫代理访问网站 还可以加一层location更具体的限制文件名 |
||||
|
|
if ($http_user_agent ~* "Firefox|MSIE") { rewrite ^(.*) http://blog.etiantian.org/$1 permanent; } |
测试禁止不同的浏览器软件访问 如果浏览器为Firefox或者IE就会跳转到http:blog.etiantian.org |
||||
|
Nginx 防 爬 虫 |
利 用 Nginx 限 制 HTTP 的 请 求 方 法 |
#Only allow these request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; } |
location ~^/(images)/ { if ($request_method ~* ^(GET)$ ) { return 501; } } |
|||
|
## Only allow GET request methods ## if ($request_method ~* ^(GET)$ ) { return 501; } |
||||||
|
HTTP最常用的方法为GET/POST,我们可以通过Nginx限制http请求的方法来达到提升服务器安全的目的, 例如,让HTTP只能使用GET、HEAD和POST方法配置如: 设置对应的用户相关权限,这样一旦程序有漏洞,木马就有可能被上传到服务器挂载的对应存储服务器的目录里,虽然我们也做了禁止PHP、SH、PL、PY等扩展名的解析限制,但是还是会遗漏一些我们想不到的可执行文件。对于这种情况,该怎么办捏?事实上,还可以通过限制上传服务器的web服务(可以具体到文件)使用GET方法,来达到防治用户通过上传服务器访问存储内容,让访问存储渠道只能从静态或图片服务器入口进入。例如,在上传服务器上限制HTTP的GET |
||||||
|
|
nginx_http_limit_conn_module |
|
||||
|
Nginx 安 全 |
控 制 并 发 链 接 数 |
imit_conn参数: 语法:limit_conn zone number; 上下文:http、server、location 配置文件如下: [root@oldboy ~]# cat /application/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server { listen 80; server_name www.etiantian.org; location / { root html; index index.html index.htm; limit_conn addr 1; #<==限制单IP的并发连接为1 } } } 还可以设置某个目录单IP并发连接数 location /download/ { limit_conn addr 1; } |
限制单IP的并发连接 在客户端使用Apache的ab测试工具进行测试
|
|||
|
|
|
|
|
|||
|
|
ngx_http_limit_req_module |
|
||||
|
Nginx 安 全 |
控 制 客 户 端 请 求 Nginx 的 速 率 |
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #<==以请求的客户端IP作为key值,内存区域命名为one,分配10m内存空间,访问速率限制为1秒1次请求(request) server { listen 80; server_name www.etiantian.org; location / { root html; index index.html index.htm; limit_req zone=one burst=5; #<==使用前面定义的名为one的内存空间,队列值为5,即可以有5个请求排队等待。 } } } |
用限制每个IP访问定义key的请求速率。 以请求的客户端IP作为key值,内存区域命名为one,分配10m内存空间,访问速率限制为1秒1次请求(request) |
|||
|
Nginx 安 全 |
访 问 报 错 转 移 |
location ~ ^/list { #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache cache_one; #对不同的HTTP状态码设置不同的缓存时间 proxy_cache_valid 200 301 302 304 1d; #proxy_cache_valid any 1d; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内 proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #proxy_ignore_headers Set-Cookie; #proxy_hide_header Set-Cookie; proxy_pass http://backend_server; add_header Nginx-Cache "$upstream_cache_status from km"; expires 1d; } access_log /data1/logs/abc.com.log access; #nginx访问日志 } |
|
|||
|
|
|
proxy_connect_timeout 60s; # nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90s; # 后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90s; # 连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; # 设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; # proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; # 高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传 proxy_set_header X-Forwarded-For $clientRealIp #取得原始用户的IP地址(针对首层代理) proxy_set_header X-Real-IP $proxy_protocol_addr; # haproxy 传递RealIP 443 proxy_set_header X-Forwarded-For $proxy_protocol_addr; # haproxy 传递RealIP 443
|
remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP. |
|||
|
Nginx 安 全 |
ssl 模 块 |
server { listen 13820; #监听端口 server_name localhost; charset utf-8; #gbk,utf-8,gb2312,gb18030 可以实现多种编码识别 ssl on; #开启ssl ssl_certificate /ls/app/nginx/conf/mgmtxiangqiankeys/server.crt; #服务的证书 ssl_certificate_key /ls/app/nginx/conf/mgmtxiangqiankeys/server.key; #服务端key ssl_client_certificate /ls/app/nginx/conf/mgmtxiangqiankeys/ca.crt; #客户端证书 ssl_session_timeout 5m; #session超时时间 ssl_verify_client on; # 开户客户端证书验证 ssl_protocols SSLv2 SSLv3 TLSv1; #允许SSL协议 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #加密算法 ssl_prefer_server_ciphers on; #启动加密算法 access_log /lw/logs/nginx/dataadmin.test.com.ssl.access.log access ; #日志格式及日志存放路径 error_log /lw/logs/nginx/dataadmin.test.com.ssl.error.log; #错误日志路径 }
|
|
|||
|
Nginx 安 全 |
防 止 sql 注 入 |
if ( $query_string ~* ".*[\;'\<\>].*" ){ |
|
|||
|
|
访问日志 |
access_log /data1/logs/abc.com.log access; #nginx访问日志 } |
|
|||
|
|
|
} |
|
|||
Nginx服务降权
(1) 给Nginx服务降权,用inca用户跑Nginx服务,给开发及运维设置普通账号,只要和inca同组即可管理Nginx,该方案解决了Nginx管理问题,防止root分配权限过大。
(2) 开发人员使用普通账户即可管理Nginx服务以及站点下的程序和日志
(3) 采取项目负责制,即谁负载项目维护处了问题就是谁负责。
实时Nginx降权方案
[root@web02 ~]# useradd inca
[root@web02 ~]# su - inca
[inca@web02 ~]$ pwd
/home/inca
[inca@web02 ~]$ mkdir conf logs www
[inca@web02 ~]$ cp /application/nginx/conf/mime.types ~/conf/
[inca@web02 ~]$ echo inca >www/index.html
[inca@web01 ~]$ cat conf/nginx.conf
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
error_log /home/inca/logs/error.log;
user inca inca;
pid /home/inca/logs/nginx.pid;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#web.fei fa daolian..............
server {
listen 8080;
server_name www.etiantian.org;
root /home/inca/www;
location / {
index index.php index.html index.htm;
}
access_log /home/inca/logs/web_blog_access.log main;
}
}
提示,需要关闭root权限的nginx,否则会报错
[root@web02 ~]# /application/nginx/sbin/nginx -s stop
[root@web02 ~]# lsof -i:80
切换用户,启动Nginx
[root@web02 ~]# su - inca
[inca@web02 ~]$ /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf &>/dev/null &
[1] 3926
[inca@web02 ~]$ lsof -i:80
[1]+ Exit 1 /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf &>/dev/null
本解决方案的优点如下:
1.给Nginx服务降权,让网站更安全
2.按用户设置站点权限,使站点更安全(无需虚拟化隔离)
3.开发不需要用root即可完整管理服务及站点
4.可实现对责任划分,网络问题属于运维的责任,打开不就是开发责任或共同承担
浙公网安备 33010602011771号