Nginx配置配置文件详解
文章目录
配置文件
- 主配置文件:/usr/local/nginx/conf/nginx.conf
- 通过nginx -c 可以指定要读取的配置文件来启动
- nginx常见的配置文件及作用:
| 配置文件 | 作用 |
|---|---|
| nginx.conf | nginx的基本配置文件 |
| mime.types | MIME类型关联的扩展文件 |
| fastcgi.conf | 与fastcgi相关的配置文件 |
| proxy.conf | 与proxy相关的配置 |
| sites.conf | 配置nginx提供的网站,包括虚拟主机 |
nginx.conf配置文件详解
- nginx.conf的内容分为以下几段:
- main配置段:全局配置段。其中main配置段中可能包含event配置段;
- event{}:定义event模型工作特性;
- http{}:定义http协议相关配置。
- 配置指令:(注:以分号结尾)
- 格式如下:
derective value1 [value2 … …];
- 支持使用变量:
- 内置变量:模块会提供内置变量
- 自定义变量:如下
set var_name value
用于调试、定位问题的配置参数
注:主配置段
daemon {on|off}; //是否已守护进程运行进程nginx,调试时应设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置1 级别2; //配置错误日志(位置与级别有以下选项,点击脚注)
正常运行必备的配置参数
user USERNSME {GROUPNAME}; //指定运行worker进程的用户和组;
pid /path/to/pid_file; //指定nginx守护进程的pid文件
worker_rlimit_nofile NUMBER; //设置所有worker进程最大可以打开的文件数,默认为1024;
worker_rlimit_core SIZE; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
优化性能的配置参数
worker_processse N; //启动N个worker进程,这里的N为了避免上下文切换,通常设置为cpu总核数-1或等于总t核数
worker_cpu_affinity CPUMASK3 [CPUMASK…]; //将进程绑定到某个CPU中,避免频繁刷新缓存
time_resolution INTERVAL; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
worker_priority NUMBER; //指明worker进程的NICE值(优先级)
事件相关配置
注:event{}段中的配置参数
use epoll; //多路复用I/O中的一种方式,仅用于linux2.6以上内核,大大提升nginx性能
accept_mutex {on|off}; //master调度用户请求至各worker进程时使用的负载均衡锁,“on”表示能让多个worker轮流地、序列化地去响应新请求
lock_file FILE; //accept_nutex用到的互斥锁锁文件路径
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择
worker_connections #; //每个进程能够接受的最大连接数
multi_accept on; //尽可能多的接受请求
Fastcgi相关配置参数
- LNMP:php要启用fpm模型
- 配置示例如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定义反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
注:当LNMP架构分台部署,“/scripts”需换成php的目录
常需要调整的参数
worker_processes NUMBER //启动NUMBER个worker进程
worker_cpu_affinity CPUMASK3 //绑定CPU核心数
worker_connections NUMBER //绑定的CPU核心每个最大连接数
worker_priorty NUMBER //调整nice值
nginx作为web服务器时使用的配置
注:http{}段配置的参数
- http{}段:由ngx_http_core_module模块引入
- http配置主要包含四个区块,结构如下:
http { ## 协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
sendfile on; ##指定nginx是否调用sendfile函数(zero copy)来输出文件,对于普通应用必须设为on;
##如果用来进行下载等应用磁盘I/O重负载应用,可设置为OFF,以平衡磁盘与网络I/O处理速度,降低系统的uptime
autoindex on; ##开启目录列表访问,适合下载服务器,默认关闭
upstream { ##负载均衡配置
...
}
server { ##服务器级别,每一个server类似于httpd中的一个<VirtualHost,通俗来说就是一个网站>
listen80;
server_name localhost;
location / { ##请求级别,类似与httpd中的<Location>,用于定义URL与本地文件系统的映射关系
root html;
index index.html index.htm;
}
}
}
- http{}段配置指令:
1)server{}:定义一个虚拟主机,示例如下:
server {
listen 80;
server_name www.idfsoft.com;
root "/vhosts/web";
}
注:
listen指定监听的地址和端口写法:
listen ADDRESS[:PORT];
listen PORT;
server_name NAME1 [NAME2...]; ##后面可以跟多个主机,名称可以用正则表达式或通配符
当有多个server时,匹配顺序如下:
1.先做精确匹配检查;
2.左侧通配符匹配检查,如.idfsoft.com
3.右侧通配符匹配检查,如mail.
4.正则表达式匹配检查,如~ ^.*.idfsoft.com$
5.default_server
2)location区段,通过指定模式来与客户端请求的URI相匹配
- 功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被响应的location配置快中的配置所处理,例如做访问控制等功能
- 语法:如下
location [修饰符] pattern {…}
- 常用的修饰符说明:
| 修饰符 | 功能 |
|---|---|
| = | 精确匹配 |
| ~ | 正则表达式模式匹配,区分大小写 |
| ~* | 正则表达式模式匹配,不区分大小写 |
| ^~ | 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式 |
| @ | 定义命名location区段,这些区段客户端不能访问,只可以有内部产生的请求访问,如try_files或error_page等 |
(1)没有修饰符表示必须以指定模式开始,如:
server {
server_name www.baibai.com;
location /abc {
......
}
}
那么如下内容可以就可以正确匹配:
(2)=:表示必须与指定的模式精确匹配,如:
server {
server_name www.baibai.com;
location = /abc {
......
}
}
那么如下内容可正确匹配:
如下内容则无法匹配:
(3)~:表示指定的正则表达式要区分大小写,如:
server {
server_name www.baibai.com;
location ~ ^/abc$ {
......
}
}
那么如下内容可以正确匹配:
如下内容则无法匹配:
(4)~*:表示指定的正则表达式不区分大小写,如:
server {
server_name www.baibai.com;
location ~* ^/abc$ {
......
}
}
那么如下内容就可以正确匹配:
如下内容则无法匹配:
查找顺序和优先级,由高到底依次为:
- 带有“=”的精确匹配优先
- 正则表达式
- 没有修饰符的精确匹配
注:有多个正则表达式出现时,按照它们在配置文件中定义的顺序
访问控制
注:用于location段,可以用主机地址表示,也可用网段表示,必须一起用
allow:设定允许那台或那些主机访问,多个参数间用空格隔开
deny:设定禁止那台或那些主机访问,多个参数间用空格隔开
例:
location / {
root html;
index index.php index.html index.htm;
allow 192.168.91.129/32;
deny all;
}
在地址为192.168.91.1中访问
在地址为192.168.91.129中访问
基于用户认证
**注:用于location段,必须一起用
auth_basic “欢迎信息”;
auth_basic_user_file FILE_PATH4;
https配置
- 创建签名证书存放目录
[root@localhost ~]# mkdir /usr/local/nginx/ssl
- 创建服务器私钥
[root@localhost ssl]# openssl genrsa -des3 -out nginx.key 1024
Generating RSA private key, 1024 bit long modulus
..............................................................++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for nginx.key: ##输入密匙
Verifying - Enter pass phrase for nginx.key: ##确认密匙
[root@localhost ssl]# ls
nginx.key
- 创建签名请求证书(CSR)
[root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr
Enter pass phrase for nginx.key: ##输入密匙
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN ##国家
State or Province Name (full name) []:HB #省
Locality Name (eg, city) [Default City]:WH ##城市
Organization Name (eg, company) [Default Company Ltd]:www.baibai.com ##公司名称
Organizational Unit Name (eg, section) []:www.baibai.com ##部门
Common Name (eg, your name or your server's hostname) []:www.baibai.com ##主机名
Email Address []:1@2.com ##邮箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ##可以不用输入
An optional company name []: ##可以不用输入
[root@localhost ssl]# ls
nginx.csr nginx.key
-生成crt
[root@localhost ssl]# openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
Signature ok
subject=/C=CN/ST=HB/L=WH/O=www.baibai.com/OU=www.baibai.com/CN=www.baibai.com/emailAddress=1@2.com
Getting Private key
Enter pass phrase for nginx.key:
[root@localhost ssl]# ls
nginx.crt nginx.csr nginx.key
- 编辑配置文件/usr/local/nginx/conf/nginx.server
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate ../ssl/nginx.crt; ##或者/usr/local/nginx/ssl/nginx.crt
ssl_certificate_key ../ssl/nginx.key; ##/usr/local/nginx/ssl/nginx.key
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
}
- 检查配置文件,并重新启动nginx服务
[root@localhost ~]# nginx -t
Enter PEM pass phrase:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload
Enter PEM pass phrase:
- 在浏览器中输入https://服务器的IP地址,点击继续前往
开启状态界面
stub_status {on|off};
- 配置如下:
location /status { ##URI不唯一
stub_status on;
allow 192.168.91.129/32; ##允许查看的地址
deny all;
}
- 访问状态页面方式:http://服务器IP/status
- 状态页面信息详解,如下表:
| 状态码 | 表示的意义 |
|---|---|
| Active connections 2 | 当前所有处于打开状态的连接数 |
| accepts | 总共处理了多少个连接 |
| handled | 成功创建多少握手 |
| requests | 总共处理了多少个请求 |
| Reading | nginx读取到客户端的Header信息数,表示正处于接受请求状态的连接数 |
| Writing | nginx返回给客户端的Header信息数,表示请求已经接受完成,且正处于处理请求或者发送响应的过程中的连接数 |
| Waiting | 开启keep-alive的情况下,这个值等于active-(reading + weiting),意思就是nginx已处理完承载等候下一次请求指令的驻留连接 |
rewrite
注:server段,location段,if中
- 语法:
rewrite REGEX REPLACEMENT FLAG;
- 适用于文件存放路径或者名字被修改后进行重写
例:
rewrite ^/images/(.*.jpg)$ /imgs/$1 break;
此处的$1用于引用(*.jpg)匹配到的内容,又如:
rewrite ^/images/(.*)$ http://www.baidu.com redirect;
如上所示,REPLACEMENT可以是某个路径,也可以是某个URL
- 常见的FLAG,如下图:
| FLAG | 作用 |
|---|---|
| last | 基本上都用这个FLAG,表示当前的匹配结束,继续下一个匹配,最多匹配10到20个,一旦此rewrite规则重写完成后,就不会再被后面的其他rewrite规则进行处理,而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程 |
| break | 中止Rewrite,不在继续匹配,一旦此rewrite规则重写完成后,有useragent对新的URL重新发起请求,且不会再被当前location内的任何rewrite规则所检查 |
| redirect | 已临时重定向的http状态302返回新的URL |
| permanent | 以永久从定向的http状态301返回新的URl |
rewrite模块的作用是用来执行URL重定向,这个机制有利于去掉恶意访问的URL,也有利于搜索引擎的优化
nginx使用的语法源于Perl兼容正则表达式库,基本语法如下表:
| 标识符 | 意义 |
|---|---|
| ^ | 必须以^后的实体开头 |
| $ | 必须以$前的实体开头 |
| . | 匹配任意字符 |
| [] | 匹配指定字符集内的任意字符 |
| [^] | 匹配任何不包括在指定字符集内的任意字符串 |
| | | 匹配 | 之前或之后的实体 |
| () | 分组,组成一组用于匹配的实体,通常会有 | 来协助 |
捕获子表达式,可以捕获放在()之间的任何文本,比如:
^(hello|sir)$ //字符串为“hello sir”,捕获的结果:$1=hello,$2=sir
注:这些被捕获的数据,在后面就可以当变量一样使用
nginx中if语法与应用
- 语法:
if (CONDITION) {…}
- 应用场景
- server段
- location段
-常见的CONDITION - 变量名(比量值为空窜,或者以“0”开始,则为false,其他的均为true)
- 以变量为操作数构成的比较表达式(可使用=,!=类似的比较操作符进行测试)
- 正则表达式的模式匹配操作:
1)~:区分大小写的模式匹配检查
2)~*:不区分大小写的模式匹配检查
3)!~ 和 !~*:对上面两种测试取反 - 测试指定路径为文件的可能性(-f,!-f)
- 测试指定路径为目录的可能性(-d,!-d)
- 测试文件的存在性(-e,!-e)
- 检查文件是否有执行权限(-x,!-x)
基于浏览器实现分离案例
if ($http_user_agent ~ Firefox) { ##火狐浏览器
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) { ##微软浏览器
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) { ##谷歌浏览器
rewrite ^(.*)$ /chrome/$1 break;
}
防盗链案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked DOMAIN_NAME; ##DOMAIN_NAME只公司的域名
if ($invalid_referer) {
rewrite ^/ http://DOMAIN_NAME/403.html;
}
}
反向代理与负载均衡
- nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。
- nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx发布的路径去读取,而不是需要从后台服务器获取;但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync+inotify做服务端自动同步或者使用NFS、MFS分布式共享存储。
- Http Proxy模块,功能很多,最常用的是proxy_pass和proxy_cache;若要使用proxy_cache,需要集成第三方的ngx_cache_purge模块,用来清楚指定的URL缓存。这个集成需要在安装nginx的时候去做,如:
./configure --add-module=…/ngx_cache_purge…
- nginx通过upstream模块来实现简单的负载均衡,upstream需要定义在http段内,访问静态资源在location \ {}段中;访问动态资源在location ~ /(.*\.php) {} 中或者其他定义动态location中,如:
http {
upstream NAME { ##NAME,集群名字,必须与location中的NAME保持一致
server 192.168.91.129:80;
server 192.168.91.130:80;
}
server {
listen 80;
server_name www.baibai.com;
location / { ##动态资源访问location ~ /(.*\.php) { 段中
root html;
index index.html index.htm;
proxy_pass http://NAME; ##与upstream中保持一致
}
}
}
- 在upstream段内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash,如:
upstream NAME {
ip_hash;
server 192.168.91.129:80 weight=5;
server 192.168.91.130:80 weight=5;
}
注:upstream用于http{}段
注:设置weight的值会将服务器的处理量增加,表示192.168.91.129被访问5次将后再将其他访问请求交给192.168.91.130
注意:这个方法本质还是轮询,而且由于客户端的IP地址可能是不断变化的,比如动态IP,翻墙等,因此ip_hash并不能完全保证同一个客户端总是由同一个服务器来处理。
位置
file
stderr
syslog:server=address[,parameter=value]
memory:size ↩︎级别(级别的从大到小排列)
debug:若要使用debug级别,需要在编译nginx时使用- -with-debug选项
info
notice
warn
error
crit
alert
emerg ↩︎CPUMASK:使用8位二进制表示CPU核心
第一颗CPU核心:00000001
第二颗CPU核心:00000010
第三颗CPU核心:00000100
第四颗CPU核心:00001000
第五颗CPU核心:00010000
第六颗CPU核心:00100000
第七颗CPU核心:01000000
第八颗CPU核心:10000000 ↩︎ ↩︎FILE_PATH内容格式:
username:password
注:手工创建不能够生效,建议用htpasswd命令来创建此文件,命令如下
htpasswd -c -m FILE_PATH USERNAME ↩︎
</div>
Nginx配置配置文件详解的更多相关文章
- nginx配置参数详解
配置参数详解 user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目.根据硬件调整,通常等于CPU数量或者2倍 ...
- Nginx的配置文件详解
主配置文件: 查看nginx的进程可以看到nginx所使用的配置文件: 主配置一般会被用来设置一些全局的参数: 参数详解: user nobody nobody; //设置nginx ...
- nginx.conf配置文件详解
一:nginx配置文件结构 nginx配置文件主要分为六个区域: main(全局设置).events(nginx工作模式).http(http设置). sever(主机设置).location(URL ...
- Nginx配置优化详解
如果你已经安装过Nginx并在生产环境中使用,那么Nginx配置优化你一定也要做,这样才能看到Nginx性能,本文就从基本配置优化开始到高层配置教你如何优化Nginx 大多数的Nginx安装指南告诉你 ...
- [转]Nginx配置信息详解
序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...
- [转帖]Nginx 的配置文件详解.
nginx配置文件nginx.conf超详细讲解 https://www.cnblogs.com/liang-wei/p/5849771.html #nginx进程,一般设置为和cpu核数一样w ...
- nginx配置转发详解
nginx各项参数的详细配置 本文主要讲解nginx.conf中server部分配置及多路转发问题: server { listen 9090; server_name 127.0.0.1; #cha ...
- nginx.conf 配置文件详解
简单的实现nginx在前端做反向代理服务器的例子,处理js.png等静态文件,jsp等动态请求转发到其它服务器tomcat: user www www; worker_processes ; erro ...
- /etc/nginx/nginx.conf配置文件详解
user nginx; #数值和cpu核数个数一致worker_processes 8; #worker与cpu绑定 worker_cpu_affinity 0001 0010 0100 1000 1 ...
随机推荐
- 保证IO流不出错
package com.io.demo1; import java.io.FileInputStream;import java.io.IOException; /** * 测试IO * io流,输入 ...
- FreeRTOS任务暂停和启动函数
任务句柄 TaskHandle_t pump_task_handle = NULL; 任务的启动函数 if(eTaskGetState(pump_task_handle) != eRunning) v ...
- js滚动及可视区域的相关的操作
element.getBoundingClientRect 判断指定元素相对于页面可视窗口的位置信息,通常结合windows.onScroll方法使用,当element.getBoundingClie ...
- Qt Creater 制作汽车仪表盘
最近项目用到了模拟仪表,网上下载大神编写的按个仪表Meter没有成功 转战 QWt 编译后,在creater中仍然无法使用,只可以在代码中使用 百度说是我编译的版本不对 扔到 开始做自己的 这个用到了 ...
- appium + Python + iOS 滑屏方法(appium版本大于1.5)
之前一直在搞android的自动化,滑动操作一直都用swipe(),比如: he1 = int(dr.get_window_size()['height'] * 0.8)he2 = int(dr.ge ...
- 第二十五篇 hashlib模块(* *)
用于加密相关的操作,Python 3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. 加密复杂程度: SHA1 ...
- 信号处理是Unix和LInux系统为了响应某些状况而产生的事件
信号处理是Unix和LInux系统为了响应某些状况而产生的事件,通常内核产生信号,进程收到信号后采取相应的动作. 例如当我们想强制结束一个程序的时候,我们通常会给它发送一个信号,然后该进程会捕捉到信号 ...
- apollo命令行传入参数
Java apollo客户端运行配置 需要在META-INF中创建app.properties文件,以配置app.id 还需要在/opt/settings/server.properties或C:/o ...
- 《学习OpenCV》课后习题解答9
题目:(P126) 创建一个程序,使其读入并显示一幅图像.当用户鼠标点击图像时,获取图像对应像素的颜色值(BGR),并在图像上点击鼠标处用文本将颜色值显示出来. 解答: 本题关键是会用cvGet2D获 ...
- valgrind使用
参数配置 gcc -g: 增加调试信息,供valgrind精确定位. -O0:关闭gcc优化:优化产生的代码可能会造成valgrind误判. valgrind --leak-check=full no ...