Nginx 服务器配置详解
Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。
Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块。
更多Nginx相关教程见以下内容:
Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。
- <section> {
- <directive><parameters>;
- }
一,全局块的配置
- user username [groupname];指定运行worker进程的用户和组
- worker_processes 4; worker进程的个数;通常其数值应该为CPU的物理核心数减1,默认为4
- error_log /path/to/error_log level [ debug | info | notice | warn | error | crit | alert | emerg ];错误日志文件及其级别,默认为error级别,错误日志在全局级别,访问日志在虚拟主机级别,调试时可以使用debug级别,但要求在编译时必须使用–with-debug启用debug功能;
- pid /path/to/pidfile_name;指定nginx的pid文件
nginx安装完成后,全局块默认只有这几个配置。
二,events块的配置
- events {
- use epoll;定义使用的事件驱动模型,建议让nginx自动选择,默认使用epoll
- worker_connections 1024;每个worker能够并发响应最大请求数,默认为1024
- }
nginx 在events只配置此两个选项;
下面介绍 http 块的配置,http块的配置比较多,用法也比较灵活,以下是比较常用的配置。
- http {
- .....
- server {
- ......
- location {
- ......
- }
- }
- server {
- ......
- location {
- ......
- }
- }
- }
三,nginx虚拟主机使用
nginx和httpd虚拟主机使用的实现一样,都有基于端口,IP,域名的虚拟机主机。要为nginx配置虚拟主机,只需在http块中额外定义一个server块。
1,配置基于端口的虚拟主机时,只需修改listen中的端口号。
- http{
- server {
- listen 80;
- server_name a.com;
- 。。。。。。
- }
- server {
- listen 8080;
- server_name b.org;
- 。。。。。。
- }
- }
2,配置基于域名的虚拟主机
- http{
- server {
- listen 80;
- server_name a.com;
- 。。。。。。
- }
- server {
- listen 80;
- server_name b.org;
- 。。。。。。
- }
- }
3,配置基于IP的虚拟主机
- http{
- server {
- listen 192.168.1.110:80;
- server_name a.com;
- 。。。。。。
- }
- server {
- listen 192.168.1.111:80;
- server_name b.org;
- 。。。。。。
- }
- }
四、访问控制access模块(基于IP)
自上而下进行检查,可以在 http, server, location, limit_except 中配置,与httpd中的配置类似。
- 语法: allow|deny address | CIDR | unix:| all;
- location /{
- root /usr/html ;
- index index.html index.htm;
- allow 172.16.100.8;
- allow 192.168.0.0/16;
- allow 10.1.1.0/16;
- deny all;
- }
五,用户认证示例
此配置是为了禁止外人访问特定页面时进行的限制,需要借助于httpd的htpasswd创建密码文件。
- 语法: auth_basic string| off;
- auth_basic_user_file file;
- 例:
- location /server {
- root /usr/html ;
- access_log off;#访问日志
- auth_basic "amdin area";#认证时的说明
- auth_basic_user_file /etc/nginx/.htpasswd;#密码文件所在位置
- }
六、建立下载站点autoindex模块
此模块为了便于用户下载站的文件等,类似于ftp的功能,本站的ftp依是如此。
- location /{
- root html/ftp;
- allow all;
- autoindex on;#激活/关闭自动索引
- autoindex_exact_size on;#设定索引时文件大小的单位(B,KB, MB 或 GB)
- autoindex_localtime on;#开启以本地时间来显示文件时间的功能。默认为关(GMT时间)
- }
七、防盗链
防盗链是为了防止别的网站盗用自己网站的图片视频等资源,并给自己网站的服务器造成额外的负担。nginx使用valid_referers 指令进行配置防盗链规则。
(1) 定义合规的引用
valid_referers none | blocked | server_names | string …;
none : 检测referer头域不存在的情况
blocked:检测referer头域的值被防火墙或者代理服务器删除或者伪装的情况。这种情况下该头域的值不以http或者https开头。
server_names : 设置一个或多个URL,可以使用统配符 * 。
(2) 拒绝不合规的引用
- if($invalid_referer){
- rewrite ^/.*$ http://www.b.org/403.html
- }
示例:
- location ~* \.(gif|jpg|png|swf|flv|rar|zip)$
- {
- root /usr/html/htdocs;
- valid_referers none blocked server_names *.tianfeiyu.com;
- if($invalid_referer){
- rewrite ^/ http://www.tianfeiyu.com/wp-content/uploads/2016/01/QQ图片20160131111643.png;
- }
- }
八、URL rewrite
rewrite用于实现URI的重写,需要pcre的支持。
rewrite指令执行顺序:
1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)
2.执行location匹配
3.执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件
如果循环超过10次,则返回500 Internal Server Error错误.
- rewrite regex replacement [flag];
- location /{
- root /www/b.org;#每次被rewrite匹配并结束后,都要重新发送请求并再次到location中进行匹配,若有break则直接响应,不再发送新请求
- rewrite ^/images/(.*)$ /imgs/$1 last;
- }
请求顺序:http://www.b.org/images/a.jpg –> http://www.b.org/imgs/a.jpg
last: 一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求;
break: 一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作;
redirect: 返回302临时重定向;
permanent: 返回301永久重定向;
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/media/$2.mp3 break;
}
此处若为last,则nginx最多循环10次,超出之后会返回500错误;
注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;
rewrite_log on|off; 是否把重写过程记录在错误日志中;默认为notice级别;默认为off;
return code;用于结束rewrite规则,并且为客户返回状态码;可以使用的状态码有204, 400, 402-406, 500-504等;