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;
}