云服务器

Nginx的基本配置与优化

2017-12-27 11:21:39 0

一、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;

}

 

上一篇: 无

微信关注

获取更多技术咨询