目录
安装配置
1.使用包管理工具
在Debian、Ubuntu下
# apt-get install nginx
在RedHat 、CentOS 下
在/etc/yum.repo.d/下新建一个仓库文件nginx.repo
,添加如下内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
然后直接yum
安装
# yum makecache
# yum install nginx
- 启动
# /etc/init.d/nginx start
- 停止
# /etc/init.d/nginx stop
- 重载配置
# /etc/init.d/nginx reload
在mac下
- 安装
$ brew install nginx
- 启动
$ nginx
- 停止
$ nginx -s stop
- 重载配置
$ nginx -s reload
2. 源代码安装
在生产环境下,由于包管理安装的nginx的方式可定义性不高,安装的版本也是较旧的版本,不能使用最新的特性。这时候可以选择源代码安装的方式,可以高度自定义。
接下来以安装nginx的1.14.0为例
- 安装依赖环境
# apt-get install build-essential libc6 libpcre3 libpcre3-dev libpcrecpp0 libssl0.9.8 libssl-dev zlib1g zlib1g-dev lsb-base openssl libssl-dev libgeoip1 libgeoip-dev google-perftools libgoogle-perftools-dev libperl-dev libgd2-xpm-dev libatomic-ops-dev libxml2-dev libxslt1-dev python-dev
- 下载源码包
# wget http://nginx.org/download/nginx-1.14.0.tar.gz
- 解压
# tar zxvf nginx-1.14.0.tar.gz
- 进入目录,生成makefile
# cd nginx-1.14.0
# ./configure \
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_v2_module \
--with-openssl=/usr/local/openssl
上面的参数可以根据需要进行选择,可参照下方[编译参数详解](#3. 编译参数详解)。如果没有特定的需求直接运行./configure
就好了。安装完成后可以通过nginx -V
查看选择的模块。
接下来进行编译安装
# make && make install
安装完成之后
- 启动nginx
# nginx
- 停止nginx
# nginx -s stop
- 重载配置
# nginx -s reload
3. 编译参数详解
参数选项 | 基本解释 |
---|---|
–help | 打印帮助信息 |
–prefix=PATH | Nginx安装部署后的根目录 默认为/usr/local/nginx目录。注意:这个目标的设置会影响其他参数中的相对目录。例如,如果设置了–sbin-path=sbin/nginx,那么实际上可执行文件会被放到/usr/local/nginx/sbin/nginx中 |
–sbin-path=PATH | 可执行文件的放置路径 <prefix>/sbin/nginx |
–conf-path=PATH | 配置文件的放置路径 <prefix>/conf/nginx.conf |
–error-log-path=PATH | error日志文件的放置路径。error日志用于定位问题,可输出多种级别(包括debug调试级别)的日志。它的配置非常灵活,可以在nginx.conf里配置为不同请求的日志并输出到不同的log文件中。这里是默认的Nginx核心日志路径 <prefix>/logs/error.log |
–pid-path=PATH | pid文件的存放路径。这个文件里仅以ASC II码存放着Nginx master的进程ID,有了这个进程ID,在使用命令行(例如nginx -s reload)通过读取master进程ID向master进程发送信号时,才能对运行中的Nginx服务产生作用 <prefix>/logs/nginx.pid |
–lock-path=PATH | lock文件的放置路径 <prefix>/logs/nginx.lock |
–user=USER | 指定Nginx worker进程运行时所属的用户。注意:不要将启动worker进程的用户设为root,在worker进程出问题时master进程要具备停止/启动worker进程的能力 |
–group=GROUP | 指定Nginx worker进程运行时所属的组 |
–build=NAME | configure执行时与编译期间产生的临时文件名称 |
–builddir=DIR | configure执行时与编译期间产生的临时文件放置的目录,包括产生的Makefile、C源文件、目标文件、可执行文件等 <nginx source path>/objs |
–with-rtsig_module | 使用rtsig module处理事件驱动 默认情况下,Nginx是不安装rtsig module的,即不会把rtsig module编译进最终的Nginx二进制程序中 |
–with-select_module | 使用select module处理事件驱动 select是Linux提供的一种多路复用机制,在epoll调用没有诞生前,例如在Linux 2.4及其之前的内核中,select用于支持服务器提供高并发连接 默认情况下,Nginx是不安装select module的,但如果没有找到其他更好的事件模块,该模块将会被安装 |
–without-select_module | 不安装select module |
–with-poll_module | 使用poll module处理事件驱动 poll的性能与select类似,在大量并发连接下性能都远不如epoll。默认情况下,Nginx是不安装poll |
–without-poll_module | 不安装poll module |
–with-file-aio | 使用AIO方式处理事件驱动 (IO异步大幅度提升性能,需要内核 2.6.22 以上的版本) |
–with-ipv6 | 使Nginx支持IPv6 |
–with-https_ssl_module | 安装https ssl module。该模块使Nginx支持SSL协议,提供HTTPS服务。 注意:该模块的安装依赖于OpenSSL开源软件,即首先应确保已经在之前的参数中配置了OpenSSL需要安装 OpenSSL library yum install openssl-devel | # apt-get install libssl-dev |
–with-https_spdy_module | 开启 ngx_https_spdy_module 模块。是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强 |
–with-https_realip_module | 开启 ngx_https_realip_module 模块 。此模块支持显示真实来源IP地址,主要用于NGINX做前端负载均衡服务器使用。 |
–with-https_addition_module | 开启 https addtion module。该模块可以在返回客户端的HTTP包体头部或者尾部增加内容。作为一个输出过滤器,支持不完全缓冲,分部分响应请求,游戏服务器不必安装,门户网站可以安装,有利于被搜索引擎收录页面信息。 |
–with-https_xslt_module | 开启 ngx_https_xslt_module 模块 这个模块可以使XML格式的数据在发给客户端前加入XSL渲染,0.7.8后面版本才可以使用。 |
–with-https_image_filter_module | 开启 ngx_https_image_filter_module 模块 。这个模块将符合配置的图片实时压缩为指定大小(width*height)的缩略图再发送给用户,目前支持JPEG、PNG、GIF格式。 注意:这个模块依赖于开源的libgd库,在安装前确保操作系统已经安装了libgd,是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是即时计算的结果,所以网站访问量大的话,不建议使用。 |
–with-https_geoip_module | 开启 ngx_https_geoip_module 模块,这个模块基于客户端的IP地址创建一些ngx_https_geoip_module变量,并与MaxMindGeoIP文件进行匹配,该模块仅用于0.7.63和0.8.6版本之后。 需要安装 yum install geoip-devel | apt-get install geoip-bin geoip-database libgeoip-dev |
–with-https_sub_module | 开启 ngx_https_sub_module 。该模块可以在Nginx返回客户端的HTTP响应包中将指定的字符串替换为自己需要的字符串 例如,在HTML的返回中,将</head>替换为</head><script language=”javascript” src=”$script”></script> |
–with-https_dav_module | 开启 ngx_https_dav_module 模块。这个模块可以让Nginx支持Webdav标准,如支持Webdav协议中的PUT、DELETE、COPY、MOVE、MKCOL等请求 默认情况下为关闭,需编译开启,如果开启WebDAV扩展动作模块,(可为文件和目录指定权限) |
–with-https_flv_module | 开启 ngx_https_flv_module 模块 ,这个模块可以在向客户端返回响应时,对FLV格式的视频文件在header头做一些处理,使得客户端可以观看、拖动FLV视频 |
–with-https_mp4_module | 开启 ngx_https_mp4_module 模块,该模块使客户端可以观看、拖动MP4视频 |
–with-https_gunzip_module | 开启 ngx_https_gunzip_module 模块,是一个过滤器, 它为不支持“gzip”编码方法的客户端解压具有“Content-Encoding: gzip”头的响应。 当希望存储压缩后的数据以节省空间和减少I/O开销,又不希望对那些不支持gzip压缩的客户端造成不利影响时, 此模块会派上用途。 |
–with-https_gzip_static_module | 开启 ngx_https_gzip_static_module 模块 ,允许发送以“.gz”作为文件扩展名的预压缩文件,防止文件被重复压缩,以替代发送普通文件。如果采用gzip模块把一些文档进行gzip格式压缩后再返回给客户端,那么对同一个文件每次都会重新压缩,这是比较消耗服务器CPU资源的。 |
–with-https_auth_request_module | 开启 ngx_https_auth_request_module 模块 |
–with-https_random_index_module | 开启 ngx_https_random_index_module 模块 ,该模块在客户端访问某个目录时,随机返回该目录下的索引文件 |
–with-https_secure_link_module | 开启 ngx_https_secure_link_module ,该模块提供一种验证请求是否有效的机制。例如,它会验证URL中需要加入的token参数是否属于特定客户端发来的,以及检查时间戳是否过期(计算和检查要求所需的安全链接网址(防盗链)) |
–with-https_degradation_module | 开启 ngx_https_degradation_module 模块,该模块针对一些特殊的系统调用(如sbrk)做一些优化,允许在内存不足的情况下返回204或444码。 |
–with-https_stub_status_module | 开启 ngx_https_stub_status_module 模块,该模块可以让运行中的Nginx提供性能统计页面,获取相关的并发连接、请求的信息 |
–without-https_charset_module | 关闭 https charset module。这个模块可以将服务器发出的HTTP响应重编码 |
–without-https_gzip_module | 关闭 ngx_https_gzip_module模块,在服务器发出的HTTP响应包中,这个模块可以按照配置文件指定的content-type对特定大小的HTTP响应包体执行gzip压缩 |
–without-https_ssi_module | 关闭 ngx_https_ssi_module模块,该模块可以在向用户返回的HTTP响应包体中加入特定的内容,如HTML文件中固定的页头和页尾 |
–without-https_userid_module | 关闭 ngx_https_userid_module模块,这个模块可以通过HTTP请求头部信息里的一些字段认证用户信息,以确定请求是否合法 |
–without-https_access_module | 关闭 访问模块,这个模块可以根据IP地址限制能够访问服务器的客户端 |
–without-https_auth_basic_module | 禁用基本的认证模块,这个模块可以提供最简单的用户名/密码认证 |
–without-https_autoindex_module | 禁用自动索引模块,该模块提供简单的目录浏览功能 |
–without-https_geo_module | 禁用Geo模块,这个模块可以定义一些变量,这些变量的值将与客户端IP地址关联,这样Nginx针对不同的地区的客户端(根据IP地址判断)返回不一样的结果,例如不同地区显示不同语言的网页 |
–without-https_map_module | 禁用Map模块,这个模块可以建立一个key/value映射表,不同的key得到相应的value,这样可以针对不同的URL做特殊处理。例如,返回302重定向响应时,可以期望URL不同时返回的Location字段也不一样 |
–without-https_split_clients_module | 切割客户端IP,该模块会根据客户端的信息,例如IP地址、header头、cookie等,来区分处理,nginx 的 Split Clients(切割客户端IP)的作用是使用 MurmurHash2 哈希算法对客户端的IP进行运算,得到一个32位的整数,这个数值范围从 0~4294967296,匹配不同的区间位置,得到不同的值赋予某个变量。最后根据这变量的不同,作不同的逻辑处理。 |
–without-https_referer_module | 该模块可以根据请求中的referer字段来拒绝请求 |
–without-https_rewrite_module | 禁用Rewrite模块,该模块提供HTTP请求在Nginx服务内部的重定向功能,依赖PCRE库 |
–without-https_proxy_module | 禁用代理模块。该模块提供基本的HTTP反向代理功能 |
–without-https_fastcgi_module | 禁用FastCGI模块。该模块提供FastCGI功能 |
–without-https_uwsgi_module | 禁用uwsgi模块。该模块提供uWSGI功能 |
–without-https_scgi_module | 禁用scqi模块。该模块提供SCGI功能 |
–without-https_memcached_module | 禁用Memcached模块。该模块可以使得Nginx直接由上游的memcached服务读取数据,并简单地适配成HTTP响应返回给客户端 |
–without-https_limit_conn_module | 禁用limit_conn_zone模块,该模块针对某个IP地址限制并发连接数。例如,使Nginx对一个IP地址仅允许一个连接。 |
–without-https_limit_req_module | 禁用Limit Requests模块。该模块针对某个IP地址限制并发请求数 |
–without-https_empty_gif_module | 禁用Empty Gif模块。该模块可以使得Nginx在收到无效请求时,立刻返回内存中的1×1像素的GIF图片。这种好处在于,对于明显的无效请求不会去试图浪费服务器资源 |
–without-https_browser_module | 禁用Browser 模块。该模块会根据HTTP请求中的user-agent字段(该字段通常由浏览器填写)来识别浏览器 |
–without-https_upstream_hash_module | 禁用Upstream模块。该模块用于配置负载均衡结构 |
–without-https_upstream_ip_hash_module | 禁用Upstream模块 该模块提供当Nginx与后端server建立连接时,会根据IP做散列运算来决定与后端哪台server通信,这样可以实现负载均衡 |
–without-https_upstream_least_conn_module | 禁用Upstream模块 中的 least 负载均衡算法 |
–without-https_upstream_keepalive_module | 禁用Upstream模块 中的 keepalive 负载均衡算法 |
–with-https_perl_module | 需要安装 perl # yum install perl-ExtUtils-Embed | # apt-get install libperl-dev |
–with-perl_modules_path=PATH | perl module放置的路径。只有使用了第三方的perl module,才需要配置这个路径 |
–with-perl=PATH | perl binary放置的路径。如果配置的Nginx会执行Perl脚本,那么就必须要设置此路径 |
–https-log-path=PATH | access日志放置的位置。每个HTTP请求到结束时都会记录 <prefix>/logs/access.log |
–https-client-body-temp-path=PATH | 处理HTTP请求时如果请求的包体需要暂时存放到临时磁盘文件中,则把这样的临时文件放置到该路径下 <prefix>/client_body_temp |
–https-proxy-temp-path=PATH | Nginx作为HTTP反向代理服务器时,上游服务器产生的HTTP包体在需要临时存放到磁盘文件时,这样的临时文件将放到该路径下 <prefix>/proxy_temp |
–https-fastcgi-temp-path=PATH | Fastcgi所使用临时文件的放置目录 <prefix>/fastcgi_temp |
–https-uwsgi-temp-path=PATH | uWSGI所使用临时文件的放置目录 <prefix>/uwsgi_temp |
–https-scgi-temp-path=PATH | SCGI所使用临时文件的放置目录 <prefix>/scgi_temp |
–without-https | 禁用HTTP服务 |
–without-https-cache | 禁用HTTP 缓冲功能 |
–with-mail | 开启邮件服务代理(mail server proxy)模块,支 持POP3, IMAP4和SMTP。该功能默认禁用 |
–with-mail_ssl_module | 开启邮件代理服务对SSL的支持。该功能默认禁用 |
–without-mail_pop3_module | 在邮件代理下禁用POP3功能。在开启邮件代理模块后该功能默认启用 |
–without-mail_imap_module | 对邮件代理服务器禁用IMAP4模块,在开启邮件代理模块后该功能默认启用 |
–without-mail_smtp_module | 对于邮件代理服务器禁用SMTP模块,在开启邮件代理模块后该功能默认启用 |
–with-google_perftools_module | Google的针对nginx性能调优的工具,需要安装:yum install gperftools gperftools-devel |
–with-cpp_test_module | C预编译器测试模块 |
–add-module=PATH | 当在Nginx里加入第三方模块时,通过这个参数指定第三方模块的路径 |
–with-cc=PATH | C编译器的路径 |
–with-cpp=PATH | C预编译器的路径 |
–with-cc-opt=OPTIONS | 如果希望在Nginx编译期间指定加入一些编译选项,如指定宏或者使用-I加入某些需要包含的目录,这时可以使用该参数达成目的 |
–with-ld-opt=OPTIONS | 最终的二进制可执行文件是由编译后生成的目标文件与一些第三方库链接生成的,在执行链接操作时可能会需要指定链接参数,–with-ld-opt就是用于加入链接时的参数。例如,如果我们希望将某个库链接到Nginx程序中,需要在这里加入–with-ld-opt=-llibraryName -LlibraryPath,其中libraryName是目标库的名称,libraryPath则是目标库所在的路径 |
–with-cpu-opt=CPU | 指定CPU处理器架构,只能从以下取值中选择:pentium、pentiumpro、pentium3、pentium4、athlon、opteron、sparc32、sparc64、ppc64 |
–without-pcre | 如果确认Nginx不用解析正则表达式,也就是说,nginx.conf配置文件中不会出现正则表达式,那么可以使用这个参数 |
–with-pcre | 强制使用PCRE库 |
–with-pcre=DIR | 指定PCRE库的源码位置,在编译Nginx时会进入该目录编译PCRE源码 |
–with-pcre-opt=OPTIONS | 编译PCRE源码时希望加入的编译选项 |
–with-pcre-jit | 编译PCRE库支持及时编译 |
–with-md5=DIR | 指定SHA1库的源码位置,在编译Nginx时会进入该目录编译SHA1源码。 注意:OpenSSL中已经有了SHA1算法的实现。如果已经安装了OpenSSL,那么完全可以使用OpenSSL实现的SHA1算法 |
–with-md5-opt=OPTIONS | 编译MD5源码时希望加入的编译选项 |
–with-md5-asm | 使用MD5的汇编源码 |
–with-sha1=DIR | 指定SHA1库的源码位置,在编译Nginx时会进入该目录编译SHA1源码。 注意:OpenSSL中已经有了SHA1算法的实现。如果已经安装了OpenSSL,那么完全可以使用OpenSSL实现的SHA1算法 |
–with-sha1-opt=OPTIONS | 编译SHA1源码时希望加入的编译选项 |
–with-sha1-asm | 使用SHA1的汇编源码 |
–with-zlib=DIR | 指定zlib库的源码位置,在编译Nginx时会进入该目录编译zlib源码。如果使用了gzip压缩功能,就需要zlib库的支持 |
–with-zlib-opt=OPTIONS | 编译zlib源码时希望加入的编译选项 |
–with-zlib-asm=CPU | 指定对特定的CPU使用zlib库的汇编优化功能,目前仅支持两种架构:pentium和pentiumpro |
–with-libatomic | 强制使用atomic库。atomic库是CPU架构独立的一种原子操作的实现。它支持以下体系架构:x86(包括i386和x86_64)、PPC64、Sparc64(v9或更高版本)或者安装了GCC 4.1.0及更高版本的架构。 |
–with-libatomic=DIR | atomic库所在的位置 |
–with-openssl=DIR | 指定OpenSSL库的源码位置,在编译Nginx时会进入该目录编译OpenSSL源码。注意:如果Web服务器支持HTTPS,也就是SSL协议,Nginx要求必须使用OpenSSL。 |
–with-openssl-opt=OPTIONS | 编译OpenSSL源码时希望加入的编译选项 |
–with-debug | 将Nginx需要打印debug调试级别日志的代码编译进Nginx。这样可以在Nginx运行时通过修改配置文件来使其打印调试日志,这对于研究、定位Nginx问题非常有帮助 |
配置文件语法
nginx是模块化的系统,整个系统是分成一个个模块的。每个模块负责不同的功能。如果不用某个模块的话,也可以去掉,可以让nginx更加轻量化。
要用的模块已经被编译进nginx了,成为nginx的一部分了,那要怎么用这些模块呢?那就得通过配置文件,这跟传统的linux服务差不多,都是通过配置文件来改变功能。nginx的模块是通过一个叫指令(directive)的东西来用的。整个配置文件都是由指令来控制的。nginx也有自己内置的指令,比如events, http, server, 和 location等,下面会进行详细解释。
如果是包管理方式安装的,配置文件默认在/etc/nginx/nginx.conf
;如果是源码安装的,配置文件则在configure
的时候指定的--conf-path
下。
nginx的配置文件分为两类。一类是主配置文件,用来设定nginx的基本和通用配置。域名的配置文件放在指定的目录下,避免主配置文件逻辑过于复杂,也方便对域名的配置文件进行管理。
1. 配置文件变量详解
变量 | 解释 |
---|---|
$remote_addr | 获取客户端ip |
$binary_remote_addr | 客户端ip(二进制) |
$remote_port | 客户端port,如:50472 |
$remote_user | 已经经过Auth Basic Module验证的用户名 |
$host | 请求主机头字段,否则为服务器名称,如:blog.sakmon.com |
$request | 用户请求信息,如:GET ?a=1&b=2 HTTP/1.1 |
$request_filename | 当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html |
$status | 请求的响应状态码,如:200 |
$body_bytes_sent | 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40 |
$content_length | 等于请求行的“Content_Length”的值 |
$content_type | 等于请求行的“Content_Type”的值 |
$http_referer | 引用地址 |
$http_user_agent | 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 |
$args | 与$query_string相同 等于当中URL的参数(GET),如a=1&b=2 |
$document_uri | 与args) 如:/2013/81.html |
$document_root | 针对当前请求的根路径设置值 |
$hostname | 如:centos53.localdomain |
$http_cookie | 客户端cookie信息 |
$cookie_COOKIE | cookie COOKIE变量的值 |
$is_args | 如果有$args参数,这个变量等于”?”,否则等于”",空值,如? |
$limit_rate | 这个变量可以限制连接速率,0表示不限速 |
$query_string | 与$args相同 等于当中URL的参数(GET),如a=1&b=2 |
$request_body | 记录POST过来的数据信息 |
$request_body_file | 客户端请求主体信息的临时文件名 |
$request_method | 客户端请求的动作,通常为GET或POST,如:GET |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2 |
$scheme | HTTP方法(如http,https),如:http |
$uri | 这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html |
$request_completion | 如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1 |
$server_addr | 服务器IP地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称,如:blog.sakmon.com |
$server_port | 请求到达服务器的端口号,如:80 |
2. 主配置文件总览
#定义运行nginx的用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#日志的级别debug info notice warn error crit alert emerg 递增-->
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
#负责HTTP服务器相关属性的配置
http {
#设定mime类型,类型由mime.type文件定义
include 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 logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#包含/etc/nginx/sites-enabled下的所有以.conf结尾的配置文件
include /etc/nginx/sites-enabled/*.conf;
#包含/etc/nginx/conf.d下的所有配置文件
include /etc/nginx/conf.d/*;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#负载均衡模块 weight(权重)模式 默认模式
upstream project1{
#按权重将请求代理至指定服务的指定端口,weight数值越大接受的请求越多
server www.do90.cn:82 weight=2;
server www.do90.com:83 weight=1;
server blog.do90.cn:84 weight=5;
}
#负载均衡模块 ip_hash模式
upstream project2{
#按照ip的hash结果分配服务器,该ip会固定访问同一个后端服务器,可以解决动态网页存在的session共享问题
ip_hash;
server www.do90.cn:port1 ;
# 当前服务暂时不参加负载均衡
server www.do90.com:port1 down;
# 作为预留备份机器,当其它机器都忙或者故障的时候才会启用
server blog.do90.cn:port1 backup;
# 可定义最大失败次数和失败时间
server www.do90.cn:port1 max_fails=3 fail_timeout=20s;
}
#负载均衡模块 fair模式 需要安装upstream_fair模块
upstream project3{
fair;
server www.do90.cn:8080;
server www.do90.com:8082;
}
#负载均衡模块 url_hash模式 需要安装url_hash模块
upstream project4{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.do90.cn访问
server_name www.do90.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
3. 域名配置文件
在主配置文件中会有include
参数,include /etc/nginx/sites-enabled/*.conf;
这个文件夹中的所有以.conf
结尾的,都会被nginx作为配置文件。下方有几个例子。
正常html访问
server
{
listen 80;
server_name example.com;
index index.html;
root /var/www;
access_log /var/log/nginx/jdnn_access.log combined;
error_log /var/log/nginx/jdnn_error.log warn;
}
配置php请求转发
server {
listen 80;
server_name m.example.com;
root /var/www/;
index index.html index.php;
if (!-e $request_filename) {
rewrite ^/(.*) /index.php/$1 last;
}
location ~ ^(.+\.php)(.*)$
{
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
access_log /var/log/nginx/admin_access.log combined;
error_log /var/log/nginx/admin_error.log warn;
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pkgame.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
配置python后端请求转发
server {
listen 80;
server_name www.example.com;
location / {
root html;
index index.html index.htm;
include uwsgi_params;#加载uWSGI配置参数
uwsgi_pass 127.0.0.1:3031;#请求转发至”127.0.0.1:3031″端口上,即uWSGI服务器
}
access_log /var/log/nginx/www_access.log combined;
error_log /var/log/nginx/www_error.log warn;
}