这篇笔记记录了nginx的configure参数,配置文件,虚拟主机配置,常用命令,信号控制等内容
configure参数说明
--prefix #安装目录
--sbin-path #nginx二进制可执行文件目录
--conf-path#主配置文件地址
--error-log-path#错误日志文件地址
--pid-path#pid文件进程文件地址
--lock-path#nginx.lock文件地址(安装文件锁定,防止安装文件被别人利用,或自己误操作。)
--user#nginx运行用户
--group#nginx运行用户组
--builddir#编译目录
--with-rtsig_module#启用rtsig模块(实时信号)
--with-select_module#启用select模块支持(一种轮询模式,不推荐在高载环境下使用)
--without-select_module#禁用select模块支持
--with-poll_module#启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)
--with-file-aio#启用file aio支持(一种APL文件传输格式)
--with-ipv6#启用ipv6支持
--with-http_ssl_module#https支持,依赖openssl
--with-openssl#指向openssl安装目录
--with-openssl-opt#在编译时为openssl设置附加参数
--with-http_realip_module#启用ngx_http_realip_module模块,这个模块允许从请求标头更改客户端的IP地址值,默认为关
--with-http_addition_module#启用ngx_http_addition_module模块(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)
--with-http_xslt_module#启用ngx_http_xslt_module支持(过滤转换XML请求)
--with-http_image_filter_module#启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)
--with-http_geoip_module#启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)
--with-http_sub_module#启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)
--with-http_dav_module#启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启
--with-http_flv_module#启用ngx_http_flv_module模块,为Flash Video(FLV)文件 提供服务端伪流媒体支持,通过返回以请求偏移位置开始的文件内容,该模块专门处理 在查询串中有start参数的请求, 和有预先设置到FLV头部的请求。
--with-http_gzip_static_module#启用ngx_http_gzip_static_module模块,在线实时压缩输出数据流
--with-http_random_index_module#启用ngx_http_random_index_module模块(从目录中随机挑选一个目录索引)
--with-http_secure_link_module#启用ngx_http_secure_link_module模块(计算和检查要求所需的安全链接网址)
--with-http_degradation_module#启用ngx_http_degradation_module模块(允许在内存不足的情况下返回204或444码)
--with-http_stub_status_module#启用ngx_http_stub_status_module模块(获取nginx自上次启动以来的工作状态)
--without-http_charset_module#禁用ngx_http_charset_module模块(重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)
--without-http_gzip_module#禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)
--without-http_ssi_module#禁用ngx_http_ssi_module模块,支持.shtml语法,目前支持SSI命令的列表是不完整的
--without-http_userid_module#禁用ngx_http_userid_module模块(该模块用来处理用来确定客户端后续请求的cookies)
--without-http_access_module#禁用ngx_http_access_module模块(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)
--without-http_auth_basic_module#禁用ngx_http_auth_basic_module模块(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)
--without-http_autoindex_module#禁用disable ngx_http_autoindex_module模块(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)
--without-http_geo_module#禁用ngx_http_geo_module模块(创建一些变量,其值依赖于客户端的IP地址)
--without-http_map_module#禁用ngx_http_map_module模块(使用任意的键/值对设置配置变量)
--without-http_split_clients_module#禁用ngx_http_split_clients_module模块(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)
--without-http_referer_module#禁用ngx_http_referer_module模块(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)
--without-http_rewrite_module#禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)
--without-http_proxy_module#禁用ngx_http_proxy_module模块,有关代理服务器的模块
--without-http_fastcgi_module#禁用ngx_http_fastcgi_module模块(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。
--without-http_uwsgi_module#禁用ngx_http_uwsgi_module模块(该模块用来医用uwsgi协议,uWSGI服务器相关)
--without-http_scgi_module#禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)
--without-http_memcached_module#禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)
-without-http_limit_zone_module#禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制)
--without-http_limit_req_module#禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)
--without-http_empty_gif_module#禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)
--without-http_browser_module#禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)
--without-http_upstream_ip_hash_module#禁用ngx_http_upstream_ip_hash_module模块(该模块用于简单的负载均衡)
--with-http_perl_module#启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)
--with-perl_modules_path#perl安装路径
--with-perl#perl库文件路径
--http-log-path#设定access log路径
--http-client-body-temp-path#设定http客户端请求临时文件路径
--http-proxy-temp-path#设定http代理临时文件路径
--http-fastcgi-temp-path#设定http fastcgi临时文件路径
--http-uwsgi-temp-path#设定http uwsgi临时文件路径
--http-scgi-temp-path#设定http scgi临时文件路径
--without-http#禁用http server功能
--without-http-cache#禁用http cache功能
--with-mail#启用POP3/IMAP4/SMTP邮件代理模块支持
--with-mail_ssl_module#启用ngx_mail_ssl_module支持
--without-mail_pop3_module#禁用pop3协议(POP3即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。是因特网电子邮件的第一个离线协议标 准,POP3协议允许用户从服务器上把邮件存储到本地主机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。POP3协议是TCP/IP协议族中的一员,主要用于 支持使用客户端远程管理在服务器上的电子邮件)
--without-mail_imap_module#禁用imap协议(一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。IMAP协议运行在TCP/IP协议之上, 使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。)
--without-mail_smtp_module#禁用smtp协议(SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。)
--with-google_perftools_module#启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)
--with-cpp_test_module#启用ngx_cpp_test_module支持
--add-module#启用外部模块支持
--with-cc#指向C编译器路径
--with-cpp#指向C预处理路径
--with-cc-opt#设置C编译器参数(PCRE库,需要指定–with-cc-opt=”-I /usr/local/include”,如果使用select()函数则需要同时增加文件描述符数量,可以通过–with-cc- opt=”-D FD_SETSIZE=2048”指定。)
--with-ld-opt#设置连接文件参数。(PCRE库,需要指定–with-ld-opt=”-L /usr/local/lib”。)
--with-cpu-opt#指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre#禁用pcre库
--with-pcre#启用pcre库
--with-pcre#指向pcre库文件目录
--with-pcre-opt#在编译时为pcre库设置附加参数
--with-md5#指向md5库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)
--with-md5-opt#在编译时为md5库设置附加参数
--with-md5-asm#使用md5汇编源
--with-sha1#指向sha1库目录(数字签名算法,主要用于数字签名)
--with-sha1-opt#在编译时为sha1库设置附加参数
--with-sha1-asm#使用sha1汇编源
--with-zlib#指向zlib库目录
--with-zlib-opt#在编译时为zlib设置附加参数
--with-zlib-asm#为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro
--with-libatomic#为原子内存的更新操作的实现提供一个架构
--with-libatomic#指向libatomic_ops安装目录
--with-debug#启用debug日志
常用命令
centos6.x服务方式管理命令(具体需要服务脚本支持,请查看CentOS6.9源码编译安装nginx+php7+mysql环境)
chkconfig --add nginx#加入服务
chkconfig nginx on#开机启动
chkconfig nginx off#取消开机启动
service nginx start#启动
service nginx stop#停止
service nginx restart#重启
service nginx reload#重新加载,不停机
service nginx status#查看运行状态
centos7.x服务方式管理命令(具体需要服务脚本支持,请查看CentOS7源码编译安装nginx+php7.2+mysql5.7并使用systemctl管理)
systemctl enable nginx.service#设置开机启动
systemctl disable nginx.service#进制开机启动
systemctl is-enabled nginx.service#查看服务是否开机启动
systemctl start nginx.service#启动
systemctl stop nginx.service#停止
systemctl restart nginx.service#重新启动
systemctl status nginx.service#查看运行状态
systemctl reload nginx#重新加载
更多systemctl命令请查看(CentOS7中systemctl的使用以及firewalld打开关闭防火墙与端口)
信号控制
ps -ef | grep nginx # 查到主进程号
kill -QUIT 主进程号 #从容停止
kill -TERM 主进程号 #快速停止Nginx
pkill -9 nginx #强制停止Nginx
#另外, 若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文件,我们就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令如下:
kill -信号类型 '/usr/nginx/logs/nginx.pid'
信号选项
命令 | 信号选项 |
---|---|
TERM, INT | 快速关闭 |
QUIT | 优雅的关闭进程,即等请求结束后再关闭 |
HUP | 改变配置文件,平滑的重读配置文件(不需要重启) |
USR1 | 重读日志,在日志按月/日分割时有用 |
USR2 | 平滑的升级 |
WINCH | 优雅关闭旧的进程(配合USR2来进行升级) |
配置文件和虚拟主机配置
#定义Nginx运行的用户和用户组
user www www;
#nginx进程数,建议设置为当前主机的CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log ar/loginx/error.log;
#进程文件
pid /usr/local/nginx/logs/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}
#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; # 客户请求头缓冲大小 nginx默认会用client_header_buffer_size这个buffer来读取header值,如果 header过大,它会使用large_client_header_buffers来读取
large_client_header_buffers 4 64k;
client_max_body_size 8m; #设定请求大小;
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒
#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;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
upstream nginx.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.1.11:80 weight=3;
server 192.168.1.12:80 weight=2;
server 192.168.1.13:80 weight=3;
}
#虚拟主机的配置,一个server就代表一个虚拟主机,这里可重复设置的配置很多,建议使用include,设置多个主机的时候可以减少配置文件的代码量;
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.jmsite.cn;
#首页文件名
index index.html index.htm index.php;
#文件目录
root /data/www;
#开启htpasswd认证
#Restrict access
#auth_basic "Authorization Required";
#auth_basic_user_file /usr/local/htpasswd.pass;
#开启gzip
gzip on;
gzip_min_length 1k;#最小压缩文件大小
gzip_buffers 4 16k;#压缩缓冲区
#gzip_http_version 1.0;#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2;#压缩等级
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;#压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
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 /home/wwwlogs/access.log access;
#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
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_pass http://127.0.0.1:8080;
}
#php和php5交给9000端口的php-fpm处理
location ~ .*.(php|php5)?$
{
#访问控制
allow 127.0.0.1;
allow 172.17.128.37;
deny all;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#设置不同的缓存时间
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}
不带www域名301跳转至www域名
server {
listen 80;
server_name jmsite.cn www.jmsite.cn;
return 301 https://www.jmsite.cn$request_uri;
}
server {
listen 80 default_server;
server_name jmsite.cn;
......
http跳转至https,不带www的https跳转至带www的https
server {
listen 80;
server_name jmsite.cn www.jmsite.cn;
return 301 https://www.jmsite.cn$request_uri;
}
server {
listen 443 ssl;
server_name jmsite.cn;
return 301 https://www.jmsite.cn$request_uri;
}
server {
listen 443 default_server ssl;
server_name www.jmsite.cn;
ssl on;
......
逻辑运算
nginx的配置中不支持if条件的逻辑中包含&& 或 || 的运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。
我们可以用变量的方式来间接实现。
# 比如要实现
if ($arg_unitid = 42012 && $uri ~/thumb/){
return 403;
}
# 可以如下操作
set $flag 0;
if ($uri ~ ^/thumb/[0-9]+_160.jpg$){
set $flag "${flag}1";
}
if ($arg_unitid = 42012){
set $flag "${flag}1";
}
if ($flag = "011"){
return 403;
}
匹配符号
=#表示精确匹配
^~#表示uri以某个常规字符串开头,大多情况下用来匹配url路径,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~#正则匹配(区分大小写)
~*#正则匹配(不区分大小写)
!~和!~*#分别为区分大小写不匹配及不区分大小写不匹配 的正则
/#任何请求都会匹配
符号优先级
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。