Nginx配置与使用
一、简单介绍
由俄罗斯程序员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 }
四、测试