浅谈Nginx做web所用到的指令

来源:互联网 发布:dota2数据分析网站 编辑:程序博客网 时间:2024/05/20 09:05

一、前言

在上次博客中谈到编译安装Nginx,以及Nginx一些特性。在一些企业中Nginx备受青睐,不仅在反向代理上面有着强大的功能,同时在web上也有这不俗的优点。现在谈谈Nginx作为web时的配置。

在Nginx中,使用yum安装与自己手动编译安装配置文件有些许差别。使用yum安装会在/etc/nginx/目录下生成nginx.conf主配置文件以及在/etc/nginx/conf.d目录下生成default.conf配置文件。而编译安装则要自己指定配置文件所在的目录,同时会在该目录下生成nginx.conf的配置文件。这里以yum安装为例。

注意,Nginx是从epel源中安装的,要自己配置yum的epel源。

在配置文件中分为三个配置段:main、event、http。所有的指令都要以分号结尾。


二、main与event配置段的模块

main配置段也叫作主配置段,用于调试、定位问题,正常运行必备的配置。event配置段用于优化性能的配置,与事件相关的配置。

正常运行必备的配置:

1、user nginx;
指定运行的worker进程的用户和组,组可以省略,如果在编译过程中指定了用户与组,那么在主配置文件中这一选项可能是被注释的

2、pid /var/run/nginx.pid;
指定nginx守护进程的pid文件

3、error_log /var/log/nginx/error.log;
定义错误日志所在文件

性能优化相关配置:

1、worker_processes auto;
worker进程的个数,通常应该略少于CPU物理核心数

2、worker_rlimit_nofile number;
指定所有worker进程所能够打开的最大文件句柄数;
对于Linux来讲,一切皆文件。当nginx作为服务器来监听在某一个套接字上,都需要打开一个套接字文件。而一个进程所能够打开的最大套接字数目为1024。而当响应用户时,需要使用套接字文件来接受用户的请求从而建立连接。对于一个并发量打的服务器来说,1024个套接字文件实在是太少了,所以这里要将number修改得尽量大一些。

3、worker_cpu_affinity auto [cpumask …];
能够将nginx进程绑定在CPU上。但是在还是不能避免cpu进行进程切换。因为当有进程调度到CPU上时,nginx的进程还是要被调度出去,当nginx的进程需要运行时再调度回来,nginx属于这个CPU,但是这颗CPU不属于nginx进程。但是,虽然CPU的绑定没有避免进程切换,但是带来了另外一个结果,那就是nginx进程不需要调度到另外的CPU上面,这就导致nginx在该CPU上面缓存的大量数据不会被丢失。这就提升了缓存的命中率了。
优点:提升缓存的命中率
缺点:进程切换还是会产生额外的消耗

4、worker_processes number | auto;
设定worker进程nice值;
nice值越小,优先级越高,会被优先调度到CPU上运行

事件相关配置:

1、accept_mutex on | off;
maser调度用户请求至各worker进程时使用的负载均衡。on表示让多个worker轮流的,序列化的去响应新请求

2、lock_file file;
accept_mytex使用到的锁文件路径

3、use method;
指明使用的事件模型,建议让nginx自行选择

4、worker_connections number;
单个worker进程所能够处理的最大并发连接数

用户用于调试与定位问题设置:

1、daemon on | off;
是否以守护进程方式运行nginx,调试时应该设置为off

2、master_process on | off;
是否以master/woker模型来运行nginx

注意,若要使用debug,需要在编译nginx时使用–with-debug选项


三、http配置段的指令

配置框架:

http{    ...   server {   #每个server类似于httpd中的<VirtualHost>,同时可以有多个       localtion URL {   ##类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系,可以有多个            root "/path/to/somedir";        }        ...   }   server {        ...   }}

1、基于端口的虚拟主机

server {    listen port;    server_name xxx;}

2、server_name NAME […]
后可跟多个主机,名称还可以使用正则表达式(~)或者通配符
(1) 先做精确匹配检查,如:www.xxx.com
(2) 左侧通配符匹配检查,如:*.xxx.com
(3) 右侧通配符匹配检查,如:mail.*
(4) 正则表达式匹配检查,如:~^.*.xxx.com$
(5) default_server

3、root path
设置资源路径映射:用于指明请求的URL所对应的资源所在的文件系统上的起始路径

4、location [ = | ~ | ~* | ^~ ] uri {…}
功能:允许根据用户请求的URI来匹配定义的个location,匹配到时,此请求将被相应的location配置块中的配置所处理。

=:精确匹配检查
~:正则表达式模式匹配检查,区分字符大小写
~*:正则表达式模块匹配检查,不区分字符大小写
^~: URI的前半部分匹配,不支持正则表达式

匹配的优先级:精确匹配(=) > ^~ > ~ > ~* >不带任何符号的有路径的location >不带任何符号的没有路径的location(/)

server {    listen 80;    server_name www.xx.com;    location / {        #用户在浏览器中输入地址,看能否与之匹配        root "/vhosts/web1";    }    location /images/ {             root "/vhosts/images";    }特别注意:这个表示http://www.magedu.com/images/a.jpg --> /vhosts/images/images/a.jpg。相当于系统从/vhosts/images目录下去找location匹配到的/images/文件。如果用户输入的是/images/1.jpg,那么系统就去/vhosts/images/images/目录下去找1.jpg    location ~* \.php$ {        fcgipass    }}

5、alias path: 与location相似,不要搞混了
用户location配置段,定义路径别名

location /images/1.jpg {    root "/vhosts/web1";}location /images/ {    alias "/www/pictures";}http://www.magedu.com/images/1.jpg --> /www/pictures/1.jpg这个的别名跟root定义的路径不同,别名系统不需要去images目录下去找文件,而是直接根据定义的别名路径下去找文件

6、error_page code […] [=code] URI | @name
根据http响应状态码来指明特定的错误页面,可以定义在location中,可以定义在server中,也可以定义在http中

error_page 404 =200 /404_customed.html  #这里的/是该主机目录下的文件[=code]: 以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码

这个一般适用于不想让别人看见出错信息,让出错信息能够显示得更加人性化一点

7、基于IP的访问控制,一般在location中添加
allow ip
deny ip
例如:允许某一个网段访问,拒绝全部
allow 192.168.64.129;
deny all;

8、基于用户做访问控制,basic, digest;
定义在location中

location / {    root "/vhosts/web1";    auth_basic "Only for VIP";    auth_basic_user_file /etc/nginx/users/.htpasswd;}# yum install httpd     //这个命令是由httpd这个包提供# mkdir /etc/nginx/user/.htpasswd# passwd -c -m /etc/nginx/user/.htpasswd tom输入密码

9、https服务
生成私钥,生成证书签署请求,并获得证书

在nginx配置文件中/etc/nginx/nginx.conf最末尾有一段配置文件,打开并修改该配置文件#server {#    listen       443 ssl;#    server_name  www.magedu.com;       主机名#    ssl_certificate      /etc/nginx/ssl/nginx.crt;         证书存放位置#    ssl_certificate_key  /etc/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   /vhosts/web1;#        index  index.html index.htm;#    }#}

10、stub_status
仅能用于location上下文,表示服务器的状态页面

location /status {    stub_status on;    allow 192.168.64.129;    deny all;}

结果实例:

Active connections: 6   #当前所有处于打开状态的连接数
server accepts handled requests
241 241 431
(1) 已经接受过的连接数
(2) 已经处理过的连接数
(3) 已经处理过的请求数,在”保持连接”模式下,请求数量可能会多余连接数量
Reading: 0 Writing: 1 Waiting: 5
Reading: 正处于接受请求状态的连接数
Writing:请求已经接受完成,正处于处理请求或者发送响应的过程中的连接参数
Waiting:保持连接模式,且处于活动状态的连接数

11、对用户的访问路径进行重写
定义在配置文件的location中

例如:...rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;...

flag:

  last: 一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理,而是有User Agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程
  break:一旦此rewrite规则重写完成后,有User Agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查
  redirect:以302响应码(临时重定向)返回新的URL
  permanent:以301响应码(永久重定向)返回新的URL

12、if
语法:if (condition) {…}
应用环境:server, loaction

condition:
(1) 变量名:
变量值为空串,或者以”0”开始,则为false,其他的均为true
(2) 以变量为操作数构成的比较表示式
可使用=, !=类似的比较操作符进行测试
(3) 正则表达式的模式匹配操作
~: 区分大小写的模式匹配检查
~*: 不区分大小写的模式匹配检查
!~和!~*: 对上面两种测试取反
(4) 测试路径为文件可能性:-f, !-f
(5) 测试指定路径为目录的可能性:-d, !-d
(6) 测试文件的存在性:-e, !-e
(7) 检查文件是否有执行权限:-x, !-x

例如:if ($http_user_agent ~* MSIE) {    rewrite ^(.*)$ /msie/$1 break;}$http_user_agent: 这是官网中定义的变量,表示用户浏览器类型MSIE:表示微软浏览器rewrite ^(.*)$ /msie/$1 break; 表示将用户的访问地址重定向到/msie目录下

这个是很有必要的,比如用户用手机访问一个网站与用户用电脑访问一个网站,显示出来的效果是完全不同的。根据不同的浏览器返回不同的站点

13、防盗链

location ~* \.(jpg|gif|jpeg|png)$ {    valid_referer none blocked www.xxx.com;     表示不对那些网络中的主机不做限制    if ($invalid_referer) {        rewrite ^/ http://www.xxx.com/403.html;     如果被限制的用户访问了图片,那么则进行重写    }}

–end–

原创粉丝点击