理解nginx的配置
nginx配置
Nginx配置文件主要分为:全局设置、http块配置。全局配置用于配置进程、日志、工作模式、连接数等公共配置;http块配置用于配置日志格式、连接超时时间、gzip、缓冲等设置,通常包含1个或多个sever块。
http块通常包含:server
(主机设置)、upstream
(上游服务器设置,主要为反向代理、负载均衡相关配置)。server
又包含location
。
server部分
的指令主要用于指定虚拟主机域名、IP和端口;upstream
的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location部分
用于匹配网页位置(比如,根目录"/","/images",等等)。
他们之间的关系式:server继承全局设置,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
可以有多个server,location属于server子集。
nginx配置详解
nginx.conf
配置详解:
# 运行用户
user nginx;
# worker角色的工作进程个数,简单可设置为CPU核数
worker_processes 2;
# CPU亲和性设置
# 如果是2核,则是01 10
# 如果是4核,则是0001 0010 0100 1000
#worker_cpu_affinity 01 10;
# 全局错误日志
#error_log logs/error.log;
#error_log logs/error.log crit;
error_log logs/error.log notice;
#error_log logs/error.log info;
# PID文件
pid logs/nginx.pid;
# worker进程可以允许打开的最大文件数
worker_rlimit_nofile 65535;
# 工作模式及连接数上限
events
{
# epoll是多路复用IO(I/O Multiplexing)中的一种方式,
# 仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
# 单个后台worker process进程的最大并发链接数
worker_connections 65535;
}
# http设置
http {
# 设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
# log格式设置
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 设置日志路径,使用定义的main格式
access_log logs/access.log main;
# 设置是否显示目录
#autoindex on;
#autoindex_exact_size off; # 人性化方式显示文件大小否则以byte显示
#autoindex_localtime on; # 按服务器时间显示,否则以gmt时间显示
# 解决虚拟主机名字过长 http://www.jb51.net/article/26412.htm
server_names_hash_bucket_size 128;
# sendfile指令设置
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime
sendfile on;
#tcp_nopush on;
# 开启gzip压缩,减少网络传输,建议开启
gzip on;
gzip_min_length 200; # 最小长度为多少才开启
gzip_buffers 4 32k;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript;
gzip_vary on;
# 客户端设置
keepalive_timeout 65; # 连接超时时间
tcp_nodelay on;
send_timeout 20; # 指定响应客户端的超时时间
# 设定客户端请求缓冲
large_client_header_buffers 4 128k;
client_header_buffer_size 128k;
client_max_body_size 10m;# 允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数
# FastCGI设置
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;
# ignore Client Closed Request
fastcgi_ignore_client_abort on;
# nginx带宽限制
#limit_zone crawler $binary_remote_addr 10m;
# http_proxy设置,按需设置
#proxy_connect_timeout 75; # 代理连接超时
#proxy_send_timeout 75; # 代理发送超时
#proxy_read_timeout 75; # 代理接收超时
#proxy_buffer_size 4k;
#proxy_buffers 4 32k;
#proxy_busy_buffers_size 64k;
#proxy_temp_file_write_size 64k;
#proxy_temp_path /www/server/nginx/proxy_temp 1 2;
# 设定负载均衡后台服务器列表,按需设置,一般不需要
upstream backend {
server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
}
# 虚拟主机配置,server 指令开始
#include /usr/local/nginx/conf.d/*.conf;
# server块必须在http块里,可以放在conf.d目录里面,每个虚拟主机一个,例如mysite.com.conf
server{
listen 80;
server_name localhost;
location /{
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
虚拟主机配置示例
/usr/local/nginx/conf.d/me.52fhy.com.conf
# 虚拟主机配置
server {
listen 80;
server_name me.52fhy.com;
index index.php index.html index.htm;
root /52fhy.com/wordpress/;
# WordPress Rewrite
location / {
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
# 解析php|php5后缀
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 设置gif|jpg|jpeg|png|bmp|swf文件缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d; # 缓存30天
}
# 设置js|css文件缓存时间
location ~ .*\.(js|css)?$
{
expires 1h; # 缓存1小时
}
# 访问日志
access_log /www/log/me.52fhy.com.log;
}
简单的nginx配置示例
nginx.conf,仅用于测试:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
server{
listen 80;
server_name localhost;
location /{
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
nginx优化
优化思路:增加nginx进程可以打开的文件数,增加子进程最大并发连接数;同时进行系统内核优化。系统内核优化也是从单个进程可以打开的文件数、子进程可以打开的连接数等入手。
常见优化参数:
# 内核优化
ulimit -n 65535
net.core.somaxconn = 262144
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
# nginx优化
worker_rlimit_nofile 65535;
use epoll;
worker_connections 65535;
keepalive_timeout 60;
内核优化如何修改:
1、ulimit参数直接运行ulimit -SHn 65535
即可,可以使用ulimit -n
查看;
2、其它参数优化示例:
net.core.somaxconn
对应文件/proc/sys/net/core/somaxconn
:
# 查看
cat /proc/sys/net/core/somaxconn
# 修改
echo 65535 > /proc/sys/net/core/somaxconn
net.ipv4.tcp_tw_recycle
对应文件/proc/sys/net/ipv4/tcp_tw_recycle
:
# 查看
cat /proc/sys/net/ipv4/tcp_tw_recycle
# 修改
echo 65535 > /proc/sys/net/ipv4/tcp_tw_recycle
3、也可以修改/etc/sysctl.conf
文件:
# 调高系统的 IP 以及端口数据限制,从可以接受更多的连接
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_window_scaling = 1
# 设置协议栈可以缓存的报文数阀值,超过阀值的报文将被内核丢弃
net.ipv4.tcp_max_syn_backlog = 3240000
# 调高 socket 侦听数阀值
net.core.somaxconn = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000
# 调大 TCP 存储大小
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = cubic
# tcp重新回收
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
修改配置之后需要执行以下命令使之生效:
sysctl -p /etc/sysctl.conf
反向代理示例
反向代理配置示例:
location / {
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#禁用缓存
proxy_buffering off;
#设置反向代理的地址
proxy_pass http://192.168.1.1;
}
代理地址根据实际情况修改。
注意:反向代理必须配置在
server
块里。
负载均衡示例
upstream site {
server 192.168.3.82:8040;
server 192.168.3.82:8041;
}
server {
listen 8039;
server_name 192.168.3.82;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://site;
}
}
访问192.168.3.82:8080的时候,会来回访问192.168.3.82:8040和192.168.3.82:8041。
注意:负载均衡必须配置在
http
块里。
负载均衡分配方式
Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
1、轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。
upstream backend {
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}
2、weight
轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
upstream backend {
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}
3、ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
upstream backend {
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}
4、fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}
5、url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
hash $request_uri;
hash_method crc32;
}
其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
参考:
1、Nginx 服务器安装及配置文件详解
http://www.runoob.com/w3cnote/nginx-install-and-config.html#rd
2、nginx配置location总结及rewrite规则写法 | Sean's Notes
http://seanlook.com/2015/05/17/nginx-location-rewrite/
3、Nginx 图片 js文件缓存配置方法-nginx-操作系统-壹聚教程网
http://www.111cn.net/sys/nginx/64074.htm
4、nginx利用proxy_cache来缓存文件
http://blog.51yip.com/apachenginx/1018.html
5、Nginx负载均衡 - 小刚qq - 博客园
http://www.cnblogs.com/xiaogangqq123/archive/2011/03/04/1971002.html
6、Nginx深入详解之upstream分配方式-scq2099yt-ChinaUnix博客
http://blog.chinaunix.net/uid-22312037-id-4081140.html
理解nginx的配置的更多相关文章
- 《深入理解Nginx》阅读与实践(一):Nginx安装配置与HelloWorld
最近在读陶辉的<深入理解Nginx:模块开发与架构解析>,一是想跟着大牛练练阅读和编写开源代码的能力,二是想学学Nginx优秀的架构设计,三是想找一个点深入下Linux下网络编程的细节.侯 ...
- 转载:第2章 Nginx的配置 概述《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19623.html Nginx拥有大量官方发布的模块和第三方模块,这些已有的模块可以帮助我们实现Web服务器上很多的功能.使用这些模块 ...
- 深刻理解Nginx之基本配置和升级(2)
3 Nginx基本配置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam9obl9mX2xhdQ==/font/5a6L5L2T/fontsize/400 ...
- 如何在Nginx下配置PHP程序环境
1.nginx与PHP的关系 首先来看nginx与php的关系, FastCGI的关系(而不是像apache那样安装成nginx的模块) FastCGI的意思是, 快速的通用网关接口:CGI Comm ...
- Nginx Location配置总结
Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...
- centos+nginx从零开始配置负载均衡
nginx负载均衡的理解 nginx是一个轻量级的.高性能的webserver,他主要可以干下面两件事: 作为http服务器(和apache的效果一样) 作为反向代理服务器实现负载均衡 现在nginx ...
- 《深入理解Nginx》阅读与实践(三):使用upstream和subrequest访问第三方服务
本文是对陶辉<深入理解Nginx>第5章内容的梳理以及实现,代码和注释基本出自此书. 一.upstream:以向nginx服务器的请求转化为向google服务器的搜索请求为例 (一)模块框 ...
- 《深入理解Nginx》阅读与实践(二):配置项的使用
前文链接:<深入理解Nginx>阅读与实践(一):Nginx安装配置与HelloWorld HelloWorld的完成意味着已经踏入了nginx的大门,虽然很振奋人心,但在编写中仍有很多疑 ...
- nginx的配置总结
总体而言,nginx的配置比起apache来是要简洁很多,而言容易理解得多的,另外官网的文档也十分的简洁易懂.我们先看一个简化版的配置文件nginx.conf: #user nobody; worke ...
随机推荐
- 动态加载js文件
由于最近在弄echarts,关于地图类的效果,但是全国地图整体的js文件太大了,加载很耗费资源,所以要根据不同省份加载不同地区的js地图, 于是就想的比较简单, var script = docume ...
- Debian使用相关
1)将普通用户添加到sudo组 首先安装sudo: root@~#: apt-get install sudo 然后添加将wzc用户添加到sudo组: root@~#: usermod -a -G s ...
- [fortify] open redirect漏洞
简介: 些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击. 场景分析 假设有一个正规网站http://ne ...
- AngularJs 时间控件
<div class="form-group col-sm-4 clearfix"> <label class="col-sm-5 control-la ...
- MongoDB学习笔记-05 聚合
MongoDB除了基本查询功能之外,还有强大的聚合工具,其中包括:count().distinct().group().mapreduce. 计数函数count count是最简单的聚合工具,用于返回 ...
- mavan 命令行创建项目
1)创建简单maven项目 mvn archetype:create -DgroupId=cn.everlook.myweb -DartifactId=myweb -DpackageName=cn.e ...
- leetcode sort List
Sort a linked list in O(n log n) time using constant space complexity. /** * Definition for singly-l ...
- NTP服务配置
一.NTP简介 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要求就非常地高,是按照A这台计算机的时间,还是按照B这台计算机的时间?NTP就是用来解决这个问题的 ...
- MVC中调用Public_Class时,VS2012老提示:当前上下文中不存在名称“Json”的解决方法
TMD,老TMD困扰我,每次新建MVC项目后就提示这个,原因在此: public class Public_Class <==此处应为:Public_Class : Controller { ...
- 分布式系统一致性问题和Raft一致性算法
一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的 ...