#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

user nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log  warn;
pid        /var/run/nginx.pid;

events {
  worker_connections  128;
}

http {
  server_tokens off;
  sendfile            on;
  tcp_nopush          on;

  keepalive_timeout   60;
  tcp_nodelay         on;

  client_max_body_size 100m;

  #access log
  log_format main '$http_host $remote_addr - $remote_user [$time_local] '
  '"$request" $status $bytes_sent '
  '"$http_referer" "$http_user_agent" '
  '"$gzip_ratio"';

  include /etc/nginx/mime.types;
  default_type  application/octet-stream;
  gzip on;
  gzip_disable "msie6";
  gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss application/javascript;
  gzip_vary on;
  gzip_comp_level 5;

  access_log  /var/log/nginx/access.log  main;
  #conf.d
  include web-console.conf ;
}
