Nginx配置与使用 - 奇天异下

技术分享 Story 127浏览 0评论

一、简单介绍

由俄罗斯程序员IgorSysoev研发,2004年开源公布,特点是:内存cpu占用低,并发能力强,稳定,配置示例,反向代理;互联网企业 70%以上公司都在使用 nginx;

 

 二、安装

1、下载地址

 

三、配置

1、配置结构(借用地址)

  •  全局块

该部分配置主要影响Nginx全局,通常包括下面几个部分:

配置运行Nginx服务器用户(组),worker process数,Nginx进程PID存放路径,错误日志的存放路径,配置文件的引入;

1 #运行用户,默认由nobody账号,可不设置
2 user nginx     
3 #nginx进程,一般设置为和cpu核数一样
4 worker_processes 4;  
5 #错误日志存放目录 
6 error_log  /data1/logs/error.log;
7 #进程pid存放位置
8 pid        /application/nginx/nginx.pid;     
  • events块

该部分配置主要影响Nginx服务器与用户的网络连接,主要包括:

设置网络连接的序列化,是否允许同时接收多个网络连接,事件驱动模型的选择,最大连接数的配置;

#use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
#其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
use epoll;     

#worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。
#最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。
worker_connections 1024;

http块

定义MIMI-Type,自定义服务日志,允许sendfile方式传输文件,连接超时时间,单连接请求数上限;

#include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。
include mime.types; #文件扩展名与类型映射表
#default_type属于HTTP核心模块指令,这里设定默认类型为二进制流
default_type application/octet-stream; #默认文件类型
#log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。
#设置日志模式
log_format  access  \'$remote_addr - $remote_user [$time_local] "$request" \'
                    \'$status $body_bytes_sent "$http_referer" \'
                    \'"$http_user_agent" $http_x_forwarded_for\';
#连接超时时间,单位是秒
keepalive_timeout 60;

除此之外,负载均衡的服务器配置也在这

#upstream表示负载服务器池,定义名字为backend_server的服务器池
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;
    server   10.254.245.19:81 weight=1 max_fails=2 fail_timeout=30s;
    server   10.254.243.39:81 weight=1 max_fails=2 fail_timeout=30s;
  #设置由 fail_timeout 定义的时间段内连接该主机的失败次数,以此来断定 fail_timeout 定义的时间段内该主机是否可用。
  #设置在指定时间内连接到主机的失败次数,超过该次数该主机被认为不可用。
  #综上,这里是各个服务器权重一致,且在30s内尝试2次失败即认为主机不可用!
  }
  • server块

配置网络监听,基于名称的虚拟主机配置,基于IP的虚拟主机配置;

 1 #server标志定义虚拟主机开始
 2 #listen用于指定虚拟主机的服务端口;
 3 listen       80;#监听端口
 4 #server_name用来指定IP地址或者域名,多个域名之间用空格分 开;
 5 server_name  www.abc.com abc.com;
 6 #index用于设定访问的默认首页地址;
 7 index index.html index.htm index.php;    #首页排序
 8 #root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
 9 root  /data0/abc;           #站点根目录,即网站程序存放目录
10 ####Charset用于 设置网页的默认编码格式。
11 charset gb2312;
12 ####access_log用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
13 access_log logs/www.ixdba.net.access.log main;
  • location块

location配置,请求根目录配置,更改location的URI,网站默认首页配置;

2、负载均衡的配置

 1 upstream abc_controll {
 2  server 127.0.0.1:8887;
 3  server 127.0.0.1:8888;
 4 }
 5 server {
 6         listen       80;
 7         server_name  www.abc.cn;
 8         root   /Users/scott/soft/apache-tomcat-9.0.10/webapps/;
 9         index  index;
10         access_log  /Users/scott/soft/runlogs/nginx/abc_access.log  main;
11         location / {
12                 if ($request_filename ~* \.(gif|jpg|png|css|js|swf|flv|rar|zip|wmv)$)
13                 {
14                         expires 30d;
15                         access_log off;
16                 }
17                 proxy_pass http://abc_controll;
18         }
19         error_page   500 502 503 504  /50x.html;
20         location = /50x.html {
21                 root   /usr/local/www/nginx-dist;
22         }
23 }

3、杂项查阅

  1 #nginx进程,一般设置为和cpu核数一样
  2 worker_processes 4;                        
  3 #错误日志存放目录 
  4 error_log  /data1/logs/error.log  crit;  
  5 #运行用户,默认即是nginx,可不设置
  6 user nginx       
  7 #进程pid存放位置
  8 pid        /application/nginx/nginx.pid;        
  9 
 10 #Specifies the value for maximum file descriptors that can be opened by this process. 
 11 #最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果
 12 worker_rlimit_nofile 51200;
 13 
 14 cpu亲和力配置,让不同的进程使用不同的cpu
 15 
 16 worker_cpu_affinity 0001 0010 0100 1000 0001 00100100 1000;
 17 
 18 #工作模式及连接数上限
 19 events  20 {
 21   use epoll;       #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
 22   worker_connections 1024;  #;单个后台worker process进程的最大并发链接数
 23 }
 24 ###################################################
 25 http  26 {
 27 
 28 include mime.types; #文件扩展名与类型映射表
 29 default_type application/octet-stream; #默认文件类型
 30 
 31 #limit模块,可防范一定量的DDOS攻击
 32 #用来存储session会话的状态,如下是为session分配一个名为one的10M的内存存储区,限制了每秒只接受一个ip的一次请求 1r/s
 33   limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
 34   limit_conn_zone $binary_remote_addr zone=addr:10m;
 35   include       mime.types;
 36   default_type  application/octet-stream;
 37 
 38 #第三方模块lua防火墙
 39     lua_need_request_body on;
 40     #lua_shared_dict limit 50m;
 41     lua_package_path "/application/nginx/conf/waf/?.lua";
 42     init_by_lua_file "/application/nginx/conf/waf/init.lua";
 43     access_by_lua_file "/application/nginx/conf/waf/access.lua";
 44 
 45  #设定请求缓存    
 46   server_names_hash_bucket_size 128;
 47   client_header_buffer_size 512k;
 48   large_client_header_buffers 4 512k;
 49   client_max_body_size 100m;
 50 
 51 
 52   #隐藏响应header和错误通知中的版本号
 53   server_tokens off;
 54   #开启高效传输模式   
 55   sendfile on;
 56 
 57 -------------------------------------------------------------------------------------------------
 58   #激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,
 59   积极的作用是减少网络报文段的数量
 60   tcp_nopush     on;
 61   #激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能
 62   tcp_nodelay on;
 63 
 64  #FastCGI相关参数:为了改善网站性能:减少资源占用,提高访问速度
 65 
 66  
 67 
 68 fastcgi_connect_timeout 300;
 69 fastcgi_send_timeout 300;
 70 fastcgi_read_timeout 300;
 71 fastcgi_buffer_size 64k;
 72 fastcgi_buffers 4 64k;
 73 fastcgi_busy_buffers_size 128k;
 74 fastcgi_temp_file_write_size 128k;
 75 
 76 ----------------------------------------------
 77 
 78 #连接超时时间,单位是秒
 79   keepalive_timeout 60;
 80 
 81   #开启gzip压缩功能
 82     gzip on;
 83  #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K。如果小于1K可能会越压越大。
 84   gzip_min_length  1k;
 85 
 86 #压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
 87   gzip_buffers     4 16k;
 88 
 89 #压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
 90   gzip_http_version 1.0;
 91 
 92 #压缩比率。用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源。
 93   gzip_comp_level 9;
 94 
 95 #用来指定压缩的类型,“text/html”类型总是会被压缩
 96   gzip_types       text/plain application/x-javascript text/css application/xml;
 97   #vary header支持。该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用
 98 
 99 Squid缓存经过Nginx压缩的数据。
100 
101 gzip_vary off;
102 #开启ssi支持,默认是off
103   ssi on;
104   ssi_silent_errors on;
105 #设置日志模式
106     log_format  access  \'$remote_addr - $remote_user [$time_local] "$request" \'
107                         \'$status $body_bytes_sent "$http_referer" \'
108                         \'"$http_user_agent" $http_x_forwarded_for\';
109 
110 #反向代理负载均衡设定部分
111 
112 #upstream表示负载服务器池,定义名字为backend_server的服务器池
113 upstream backend_server {
114     server   10.254.244.20:81 weight=1 max_fails=2 fail_timeout=30s;
115     server   10.254.242.40:81 weight=1 max_fails=2 fail_timeout=30s;
116     server   10.254.245.19:81 weight=1 max_fails=2 fail_timeout=30s;
117     server   10.254.243.39:81 weight=1 max_fails=2 fail_timeout=30s;
118   #设置由 fail_timeout 定义的时间段内连接该主机的失败次数,以此来断定 fail_timeout 定义的时间段内该主机是否可用。默认情况下这个数值设置为 1。零值的话禁用这个数量的尝试。
119 
120 设置在指定时间内连接到主机的失败次数,超过该次数该主机被认为不可用。
121 
122 #这里是在30s内尝试2次失败即认为主机不可用!
123   }
124 ###################
125 
126 #基于域名的虚拟主机
127  server 128   {
129 
130 #监听端口
131     listen       80;
132     server_name  www.abc.com abc.com;    
133     index index.html index.htm index.php;    #首页排序
134     root  /data0/abc;                            #站点根目录,即网站程序存放目录 
135     error_page 500 502 404 /templates/kumi/phpcms/404.html;   #错误页面
136 #伪静态   将www.abc.com/list....html的文件转发到index.php。。。
137 #rewrite ^/list-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /index.php?m=content&c=index&a=lists&catid=$1&types=$2&country=$3&language=$4&age=$5&startDate=$6&typeLetter=$7&type=$8&page=$9 last;
138 #location 标签,根目录下的.svn目录禁止访问
139     location ~ /.svn/ {
140      deny all;
141     }
142             location ~ \.php$   
143              {  #符合php扩展名的请求调度到fcgi server  
144               fastcgi_pass  127.0.0.1:9000;  #抛给本机的9000端口
145               fastcgi_index index.php;    #设定动态首页
146               include fcgi.conf;
147              }
148             allow   219.237.222.30 ;  #允许访问的ip
149             allow   219.237.222.31 ;
150             allow   219.237.222.32 ;
151             allow   219.237.222.33 ;
152             allow   219.237.222.34 ;
153             allow   219.237.222.35 ;
154             allow   219.237.222.61 ;
155             allow   219.237.222.28 ;
156             deny    all;            #禁止其他ip访问
157             }
158     location ~ ^/admin.php
159          {
160             location ~ \.php$
161              {
162               fastcgi_pass  127.0.0.1:9000;
163               fastcgi_index index.php;
164               include fcgi.conf;
165              }
166             allow   219.237.222.30 ;
167             allow   219.237.222.31 ;
168             allow   219.237.222.32 ;
169             allow   219.237.222.33 ;
170             allow   219.237.222.34 ;
171             allow   219.237.222.35 ;
172             allow   219.237.222.61;
173             allow   219.237.222.28;
174          deny    all;
175             }
176 
177 #将符合js,css文件的等设定expries缓存参数,要求浏览器缓存。
178 
179 location~ .*\.(js|css)?$ {
180 
181        expires      30d; #客户端缓存上述js,css数据30天
182 
183     }
184 
185 ##add by 20140321#######nginx防sql注入##########
186 
187 ###start####
188 if ( $query_string ~* ".*[\;\'\<\>].*" ){
189     return 444;
190     }
191 if ($query_string  ~* ".*(insert|select|delete|update|count|\*|%|master|truncate|declare|\\'|\;|and|or|\(|\)|exec).* ") 
192     {  
193     return 444; 
194     }
195 if ($request_uri ~* "(cost\()|(concat\()") {
196                  return 444;
197     }
198 if ($request_uri ~* "[+|(%20)]union[+|(%20)]") {
199                  return 444;
200     }
201 if ($request_uri ~* "[+|(%20)]and[+|(%20)]") {
202                  return 444;
203     }
204 if ($request_uri ~* "[+|(%20)]select[+|(%20)]") {
205                  return 444;
206     }
207 set $block_file_injections 0;
208 if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") {
209 set $block_file_injections 1;
210 }
211 if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
212 set $block_file_injections 1;
213 }
214 if ($block_file_injections = 1) {
215 return 448;
216 }
217 set $block_common_exploits 0;
218 if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
219 set $block_common_exploits 1;
220 }
221 if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
222 set $block_common_exploits 1;
223 }
224 if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
225 set $block_common_exploits 1;
226 }
227 if ($query_string ~ "proc/self/environ") {
228 set $block_common_exploits 1;
229 }
230 if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") {
231 set $block_common_exploits 1;
232 }
233 if ($query_string ~ "base64_(en|de)code\(.*\)") {
234 set $block_common_exploits 1;
235 }
236 if ($block_common_exploits = 1) {
237 return 444;
238 }
239 set $block_spam 0;
240 if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b") {
241 set $block_spam 1;
242 }
243 if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") {
244 set $block_spam 1;
245 }
246 if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b") {
247 set $block_spam 1;
248 }
249 if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") {
250 set $block_spam 1;
251 }
252 if ($block_spam = 1) {
253 return 444;
254 }
255 set $block_user_agents 0;
256 if ($http_user_agent ~ "Wget") {
257  set $block_user_agents 1;
258 }
259 # Disable Akeeba Remote Control 2.5 and earlier
260 if ($http_user_agent ~ "Indy Library") {
261 set $block_user_agents 1;
262 }
263 # Common bandwidth hoggers and hacking tools.
264 if ($http_user_agent ~ "libwww-perl") {
265 set $block_user_agents 1;
266 }
267 if ($http_user_agent ~ "GetRight") {
268 set $block_user_agents 1;
269 }
270 if ($http_user_agent ~ "GetWeb!") {
271 set $block_user_agents 1;
272 }
273 if ($http_user_agent ~ "Go!Zilla") {
274 set $block_user_agents 1;
275 }
276 if ($http_user_agent ~ "Download Demon") {
277 set $block_user_agents 1;
278 }
279 if ($http_user_agent ~ "Go-Ahead-Got-It") {
280 set $block_user_agents 1;
281 }
282 if ($http_user_agent ~ "TurnitinBot") {
283 set $block_user_agents 1;
284 }
285 if ($http_user_agent ~ "GrabNet") {
286 set $block_user_agents 1;
287 }
288 if ($block_user_agents = 1) {
289 return 444;
290 }
291 
292 ###end####
293      location ~ ^/list {
294          #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
295          proxy_next_upstream http_502 http_504 error timeout invalid_header;
296          proxy_cache cache_one;
297          #对不同的HTTP状态码设置不同的缓存时间
298          proxy_cache_valid  200 301 302 304 1d;
299          #proxy_cache_valid  any 1d;
300          #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
301          proxy_cache_key $host$uri$is_args$args;
302          proxy_set_header Host  $host;
303          proxy_set_header X-Forwarded-For  $remote_addr;
304          proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
305          #proxy_ignore_headers Set-Cookie;
306          #proxy_hide_header Set-Cookie;
307          proxy_pass http://backend_server;
308          add_header      Nginx-Cache     "$upstream_cache_status  from  km";
309 
310           expires      1d;
311         }
312 
313     access_log  /data1/logs/abc.com.log access;    #nginx访问日志
314   }
315 -----------------------ssl(https)相关------------------------------------
316 
317 server {
318   listen 13820; #监听端口
319   server_name localhost;
320   charset utf-8; #gbk,utf-8,gb2312,gb18030 可以实现多种编码识别
321   ssl on; #开启ssl
322   ssl_certificate /ls/app/nginx/conf/mgmtxiangqiankeys/server.crt; #服务的证书
323   ssl_certificate_key /ls/app/nginx/conf/mgmtxiangqiankeys/server.key; #服务端key
324   ssl_client_certificate /ls/app/nginx/conf/mgmtxiangqiankeys/ca.crt; #客户端证书
325   ssl_session_timeout 5m; #session超时时间
326   ssl_verify_client on; # 开户客户端证书验证 
327   ssl_protocols SSLv2 SSLv3 TLSv1; #允许SSL协议 
328   ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #加密算法
329   ssl_prefer_server_ciphers on; #启动加密算法
330   access_log /lw/logs/nginx/dataadmin.test.com.ssl.access.log access ; #日志格式及日志存放路径
331   error_log /lw/logs/nginx/dataadmin.test.com.ssl.error.log; #错误日志存放路径
332 
333 }
334 
335 -------------------------------------------------------------------------
336 }

 

四、测试

转载请注明:成长的对话 » Nginx配置与使用 - 奇天异下