开发技术

Nginx的基本配置与优化

一、Nginx的完整配置
Nginx的配置文件默认在Nginx程序安装目录的conf二级目录下,主配置文件为Nginx.conf。

 

以下是一份nginx配置

# 使用的用户和组

user  www www;

# 指定工作衍生的进程数(一般等于CPU的总核数或总核数的2倍,例如两个4核CPU,总核数为8)

worker_processes 8;

#指定错误日志存放路径,错误日志级别可选为:[ debug | info | notice | warn | error | crit ]

error_log  /data1/logs/nginx_error.log  crit;

#指定PID存放路径

pid        /usr/local/webserver/nginx/nginx.pid;

 

#指定文件描述符数量

worker_rlimit_nofile 51200;

 

events

{

# 使用的网络I/O模型,Linux推荐epoll,freeBSD系统推荐使用kqueue模型

use epoll;

 

# 允许的连接数

worker_connections 51200;

}

 

http

{

include       mime.types;

default_type  application/octet-stream;

#设置使用的字符集,如果一个网站有多种字符集,请不要随便设置,应在代码证通过相关标签设置。

#charset  gb2312;

 

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

 

#设置客户端能够上传文件大小

client_max_body_size 8m;

 

sendfile on;

tcp_nopush     on;

 

keepalive_timeout 60;

 

tcp_nodelay on;

 

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

# 开启gzip压缩

gzip on;

gzip_min_length  1k;

gzip_buffers     4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types       text/plain application/x-javascript text/css application/xml;

gzip_vary on;

 

#limit_zone  crawler  $binary_remote_addr  10m;

 

server

{

listen       80;

server_name  www.yourdomain.com yourdomain.com;

index index.html index.htm index.php;

root  /data0/htdocs;

 

#limit_conn   crawler  20;

 

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires      30d;

}

 

location ~ .*\.(js|css)?$

{

expires      1h;

}

 

log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” $http_x_forwarded_for’;

access_log  /data1/logs/access.log  access;

}

}

 

Nginx.conf配置文件主要由一下几个部分构成:

……..

Events

{

……

}

http

{

…….

Server

{

……

}

 

Server

{

……

}

……

}

 

二、虚拟主机配置
1.什么是虚拟主机

虚拟主机使用特殊的软硬件技术,把一台运行在因特网上的服务器主机分成姨太太“虚拟”的主机,每台主机可以是一个独立的网站,可以有独立的域名,有完整的WWW,FTP,Email等功能,同一台主机上的虚拟主机完全独立的。

利用虚拟主机,不用为每一个网站提供一台独立的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器,同一组Nginx进程运行多个网站的功能。

以下是nginx虚拟主机配置的代码

http

{

server

{

listen          80 default;

server_name     _*;

access_log      logs/default.access.log combined;

location / {

index index.html;

root  /data0/htdocs/htdocs;

}

}

}

 

2.配置基于IP的虚拟机

IP别名背后的概念很简单:可以在一块物理网卡上绑定多个IP地址。这样就能够在使用单一网卡的同一个服务器上运行多个基于IP的虚拟主机。设置IP别名也非常简单,秩序配置系统上的网络接口,让它监听额外的IP地址。在Linux系统上,可以使用标准的网络配置工具添加IP别名。

以linux系统为例:

先用ifconfig查看服务器的IP地址。eth0的IP地址为192.168.8.42,本地lo的地址为127.0.0.1。

如果要在eth0网卡添加连个IP别名192.168.8.43和192.168.8.44,可以通过ifconfig和route来进行。

IP配置完毕,我们配置一下nginx的配置文件就可以实现IP访问对应的内容了。

http

{

#第一个虚拟机

server

{

# 监听的IP

listen          192.168.8.43:80;

# 主机名称

server_name    192.168.8.43;

# 日志文件存放路径

access_log      logs/server1.access.log combined;

location /

{

# 默认首页文件

index index.html index.htm;

# 网页存放目录

root  /data0/htdocs/server1;

}

}

# 第二个虚拟机

{

# 监听的IP

listen          192.168.8.44:80;

#主机名称

server_name    192.168.8.44;

#日志存放位置

access_log      logs/server2.access.log combined;

location /

{

#默认首页文件

index index.html index.htm;

# 网页文件存放路径

root  /data0/htdocs/server2;

}

}

# 第三个虚拟机

server

{

# 监听的ip

listen          192.168.8.45:80;

# 主机名称

server_name    192.168.8.45;

# 日志路径

access_log      logs/server3.access.log combined;

location /

{

# 默认首页文件

index index.html index.htm;

# 网页文件存放目录

root  /data0/htdocs/server3.com;

}

}

}

 

 

3.配置基于域名的虚拟主机

基于域名的虚拟机是最常见的虚拟机,只需配置你的DNS服务器,讲每个主机名映射到正确的IP地址,然后配置Nginx服务器,令其识别不同的主机名就可以了。这种虚拟主机技术,使得很多歌虚拟主机可以共享一个IP地址,有效解决IP地址不足的问题。

以下是基于域名的虚拟主机配置代码

http

{

# 第一台虚拟主机

server

{

# 监听端口

listen     80;

# 主机名称

server_name    aaa.domain.com;

# 日志存放位置

access_log      logs/aaa.domain.com.access.log combined;

location /

{

# 默认首页文件

index index.html index.htm;

# 网页文件存放目录

root  /data0/htdocs/aaa.domain.com;

}

}

# 第二台主机

server

{

# 监听端口

listen     80;

# 主机名

server_name    bbb.otherdomain.com;

#日志

access_log      logs/bbb.otherdomain.com.access.log combined;

location /

{

# 首页文件

index index.html index.htm;

# 网页存放位置

root  /data0/htdocs/bbb.otherdomain.com;

}

}

# 第三台主机

server

{

# 监听端口

listen     80;

#主机名称

server_name    www.domain.com domain.com *.domain.com;

# 日志

access_log      logs/bbb.domain.com.access.log combined;

location /

{

# 默认首页

index index.html index.htm;

# 网页存放位置

root  /data0/htdocs/domain.com;

}

}

}

 

三、Nginx的日志文件配置与切割
我们配置虚拟主机里面已经使用access _log进行了记录日志。与Nginx日志相关的指令有两条,一条是log_format,用来设置日志的格式。另一条是access_log,用来指定日志文件存放路径,格式和缓存大小。两条指令在Nginx配置文件中可以在http俩面,也可以在虚拟主机里。

 

1.用log_format指令设置日志格式

在Nginx中日志文件是由log_format这个指令来定义的,它的语法如下:

log_format    name    format
##    name:指的是日志格式的名称(后面调用)
##    format:设置日志具体格式的

实例:

# onelog

log_format  onelog  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent””$http_x_forwarded_for”‘
‘”$request_time”‘;
# twolog

log_format  twolog  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent””$request_time”‘;

 

参数说明:

$remote_addr 和 $http_x_forwarded_for:记录客户端的ip地址。

$remote_user:记录客户端用户名称。

$time_local:记录访问时间与时区。

$request:记录请求的URL与HTTP协议。

$status:记录请求状态;成功是200。

$body_bytes_sent:记录发送给客户端文件主体内容大小。

$http_referer:记录从那个页面链接访问过来的。

$http_user_agent:记录客户端浏览器的相关信息。

$request_time : 记录request请求时间

log_format   name 参数可以用来指定不同的日志格式

例:

access_log  /var/log/nginx/access.log  onelog;

or

access_log  /var/log/nginx/access.log  twolog;

日志打印的格式分别和上面不同name参数所定义的格式相同

 

2.用access_log指令指定日志文件存放路径

用log_format指令设置了日志格式之后,需要用access_log指令指定日志文件存放路径。

Access_log指令如下:

Access_log path [format [buffer=size | off]]

其中path表示日志文件存放路径,format表示使用log_format指令设置的日志名称,buffer=size表示设置内存缓冲区的大小,例如buffer=32k。

(1)不记录日志

Access_log off;

(2)如果使用默认格式记录日志

Access_log /data/logs/rizhi.log;   或者  Access_log /data/logs/rizhi.log combined;

(3)如果想使用自定义格式的日志记录,可以使用以下事例,其中的mylogformat是日志格式名称:

Log_format mylogformat ‘自定义的格式’

Access_log /datal/logs/access.log mylogformat buffer=32k;

(4)在Nginx0.7.4之后的版本中,access_log指令指令中的日志文件路径可以包含变量,例如:access_log/data1/logs/$server_name.log combined;

假设server_name指令设置的虚拟主机名称为test.domain.com,那么access_log指令将把访问日志记录在/test.domain.com.log文件中

 

3.Nginx日志文件的切割

生产环境仲的服务器,由于访问日志文件增长速度飞快,日志太大会严重影响服务器效率。为了方便对日志进行分析计算,必要对日志文件进行定时切割。定时切割的方式有按月,按天,按小时等进行切割。最常用按天切割。

Nginx不支持像Apache一样使用cronolog来轮转日志,但是可以采用以下方式实现日志文件的切割:

mv/data1/logs/access.log /data1/logs/20170904.log

kill -USER1 Nginx 主进程号

首先通过MV命令将日志文件重命名为/data1/logs/20170904.log,然后发送kill-USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件/data1/logs/access.log。如果Nginx.conf配置文件中使用了”pid/usr/local/webserver/nginx/nginx.pid;”指令指定了pid文件的存放路径,我们可以通过cat这个pid文件获取Nginx的主进程号,命令如下:

Kill -USR1 ‘cat  /usr/local/webserver/nginx/nginx.pid’

如果想每天定式切割日志,还需要借助crontab。我们可以写一个按天切割的日志,按年,按月份目录存放日志的shell脚本:

vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

输入以下的内容

另外,配置crontab每天凌晨00:00定时执行这个脚本:

crontab -e

00 00 ***/bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

这个shell脚本和crontab配置主要实现的功能为:假设今天为2017年9月3日,Nginx当前的日志文件为/data1/logs/access.log,2017年9月4日00:00会执行cut_nginx_log.sh脚本,脚本会先创建一个目录为/data1/logs/20170903,然后将/data1/logs/access.log文件移动并重命名为/data1/logs/20170903/access_20170903.log,再发送kill -USR1信号给Nginx主进程号,告诉Nginx重新生成一个/data1/logs/access.log文件。

 

4.Nginx的压缩输出配置

gzip是一种压缩技术。经过gzip压缩后页面大小可以为原来的30%甚至更小。这样,用户浏览页面时候速度快很多。Gzip的压缩页面需要浏览器和服务器双方同时支持,实际上是服务起压缩,浏览器解压。市场上大部分浏览器都支持gzip。

Nginx的压缩输出由一组gzip压缩指令实现。它位于http{…}之间

gzip on;

gizp_min_length 1k;

Gzip_http_version 1.1;

Gzip_buffers 4 16k;

Gzip_comp_level 2;

Gzip_types text/plain application/x-javascript test/css application/xml;

Gzip_vary on;

 

5.Nginx的自动列目录配置

我们经常看到一些开源软件的下载页面是能够自动列目录的,这一功能Apache可以实现,Nginx同样可以实现,前提条件是当前目录下不存在用index指令设置的默认首页文件。如果必须要在某一虚拟主句的location/{…}目录控制中配置自动列目录,只需要加上如下代码:

Location / {

Autoindex on;

}

另外,还有两项跟自动列目录相关的指令,分别为:

Autoindex_exact_size [on|off]

设定索引文件大小的单位(B,KB,MB,GB)

Autoindex_localtime[on|off]

开启以本地时间来显示文件时间的功能。默认为关。

 

6.Nginx的浏览器本地缓存设置

浏览器缓存是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面的时候,浏览器就可以从本地磁盘现实文档,这样可以加速页面浏览。缓存可以节约网络资源,提高网络的效率。

我们可以通过expires指令输出header头来实现:

语法:expires[time|epoch|max|off]

默认值:expires off

作用域:http,server,location

用途:使用本指令可以控制http应答中的expires和cache-control的header头信息可以在time值中使用正数或负数。Expires头标的值将通过当前系统时间加上你设定time值来获得。

Epoch指定expires的值为1 january,1970,,0:00:01 GMT。

Max指定expires的值为31 December 2037 23:59:59GMT,cache-control的值为10年。-1代表服务器当前时间为-1s,就是永不过期。

Cache-control头标的值由你指定的时间决定。

负数:cache-control:no-cache

正数或零:cache-control:max-age=#,#为您指定时间的秒数。

Off表示不修改expries和cache-control的值。

如果js文件,图片这些东很少被修改,则可以通过expires设置浏览器缓存。

Location ~ .*\.(gif|jpg|jpeg|png|bmp)$

{

Expires 30d;

}

Location ~ .*\.(js|css)?$

{

Expires 1h;

}

 

Be the First to comment.

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注

6 views