1.默认虚拟主机
1.1首先我们要编辑配置文件: vim /usr/local/nginx/conf/nginx.conf 增加: include vhost/*.conf
1.2 生效配置文件
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的默认行为。
而且,可以显式地设置某个主机为默认虚拟主机,即在"listen"指令中设置"default_server"参数:
如果没有在虚拟主机中配置default那么就会以
创建vhost目录: mkdir /usr/local/nginx/conf/vhost
进入vhost目录下并创建编辑一个.conf文件:
cd /usr/local/nginx/conf/vhost 加入如下内容
这里面产生很多conf,以ASCii码排序在前面的第一个为默认虚拟主机
2.Nginx用户认证
2.1配置文件
location/
{
auth_basic "User Authentication";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
备注:一定要注意auth_basic_user_file路径,否则会不厌其烦的出现403。
1.针对目录的用户认证: 在location后面加上目录名字即可
2.针对文件的用户认证: 在location后面加上匹配文件名字,下图的意思就是匹配到admin.php这个文件就需要用户认证
3.Nginx域名重定向
3.1 配置文件
server
{
listen 80;
server_name test.com test1.com test2.com;
//server_name后面支持写多个域名,这里要和httpd的做一个对比
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
//permanent为永久重定向,状态码为301,如果写redirect则为302
}
}
3.2 重定向状态码
一.last & break
(1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。
注意一点就是,他们会跳过所有的在他们之后的rewrite 模块中的指令,去选择自己匹配的location
(2)last 和 break 当出现在location 内部时,两者就存在了差异
last: 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚刚的行为
break: 使用了break 指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。
二、permanent & redirect:
permanent: 永久性重定向。请求日志中的状态码为301
redirect:临时重定向。请求日志中的状态码为302
从实现功能的角度上去看,permanent 和 redirect 是一样的。不存在好坏。也不存在什么性能上的问题。但是对seo会有影响,这里要根据需要做出选择
在 permanent 和 redirect 中提到了 状态码 301 和 302。 记住:last 和 break 想对于的访问日志的请求状态码为200
这两类关键字差异:
当你打开一个网页,同时打开debug 模式时,会发现301 和 302 时的行为是这样的。第一个请求301 或者 302 后,浏览器重新获取了一个新的URL ,然后会对这个新的URL 重新进行访问。所以当你配置的是permanent 和 redirect ,你对一个URL 的访问请求,落到服务器上至少为2次;而当你配置了last 或者是break 时,你最终的URL 确定下来后,不会将这个URL返回给浏览器,而是将其扔给了fastcgi_pass或者是proxy_pass指令去处理。请求一个URL ,落到服务器上的次数就为1次。
注意:配置last 在跨域的时候效果和redirect一致,都是返回302状态码,请求地址也发生改变
4.Nginx访问日志
4.1Nginx会把每个用户访问往咱的日志信息记录到指定的日志文件里,供网站管理员分析用户浏览行为等,此功能又 ngx_http_log_module 模块负责。
4.2 访问日志参数
Nginx访问日志主要有两个参数控制
log_format #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)
access_log #用来指定日至文件的路径及使用的何种日志格式记录日志
4.3配置文件
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
字段解释:
remote_addr : 客户端地址
remote_user : 客户端用户名
time_local : 服务器时间
request : 请求内容,包括方法名,地址,和http协议
http_host : 用户请求是使用的http地址
status : 返回的http 状态码
request_length : 请求大小
body_bytes_sent : 返回的大小
http_referer : 来源页
http_user_agent : 客户端名称
request_time : 整体请求延时
5.Nginx防盗链
5.1配置文件
server {
listen 80;
server_name 192.168.0.116; ///被访问的域名
location ~*.(gif|jpg|png|swf|flv)$ { ///定义对gif/jpg/png/swf/flv等静态页面进行防盗
root /usr/local/nginx/html; ///指定上述静态页面放在的位置
valid_referers none blocked 192.168.0.115; ///指定哪个域名可以访问本静态服务器,也可以是ip地址,这里我指定的是192.168.0.115,也就是内部的前端apache服务器,只允许这台访问。
if ($invalid_referer) {
return 403; ///如果有其他机器访问这台nginx服务器就会给那台机器返回一个403访问禁止的页面,也就是说如果出现了盗用现象就提示403错误。
}
}
}
注意这一行 “valid_referers none blocked" 其中"none" "blocked" 的意思分别是:
none代表没有referer;blocded代表有referer但是被防火墙或者是代理给去除了。
首先当我输入我要打开的网址的时候,因为是直接输入的没有referer所以匹配了
valid_referers后面的none或者是blocked 所以invalid_referer值为0 所以不进行跳转.
当我是从这个网站里面的链接跳到该网站首页的时候 因为referer的值是肯定包含srever_names 所以匹配了server_names所以不进行跳转。
当我从搜素引擎进去的时候因为referer字段类似于www.google.com.hk/search
开始进行匹配 发现没有一个匹配,则此时会设置invalid_referer值为1 if语句成功执行,进行了跳转. 达到功能
如果把这两个(none,blocked)去掉就可以真正的实现防盗连了!因为只有匹配到server_name的时候,才不会进行跳转。
6.Nginx访问控制
6.1配置文件
基于IP的访问控制,基于Nginx的http_access_module模块,是Nginx本身内置的模块,不需要安装的时候配置。也就是允许哪些IP访问,不允许哪些IP访问
location /
{
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
从上到下的顺序,类似iptables。匹配到了便跳出。
如上的例子先禁止了192.16.1.1,接下来允许了3个网段,
其中包含了一个ipv6,最后未匹配的IP全部禁止访问.
7.Nginx解析php相关配置
7.1 配置文件
配置如下:
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www/test02$fastcgi_script_name;
}
fastcgi_pass 用来指定php-fpm监听的地址或者socket
fastcgi_index index.php #设定访问根目录默认去找的文件
fastcgi_param SCRIPT_FILENAME /data/www/test02$fastcgi_script_name #设置访问根目录时默认寻找的文件
fastcgi_param SCRIPT_FILENAME /data/www/test02/abc$fastcgi_script_name #访问根目录www.test02.com/
会去默认寻找abc中index.php文件,而此时去访问这个index.php文件是寻找不到的只能通过根目录去访问
www.test02.com/abc/index.php 返回404
查看/usr/local/php-fpm/etc/php-fpm.conf
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
;listen = 127.0.0.1:9000
listen.mode = 666
user = php-fpm
group =php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers =5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
此文件设定了nginx 绑定的位置去给php-fpm解析
unix socket方式
优点:
unix socket方式要比tcp的方式快,而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。会有很多linux傻瓜面板,他们可能会有很多中 php-fpm的版本,那么如果是不同版本去开不同的端口,然后nginx去配置的话,你要记住很多端口,sock文件便是解决这个问题最简单的方法。Socket是使用unix domain socket连接套接字/devm/php-cgi.sock(很多教程使用路径/tmp,而路径/devm是个tmpfs,速度比磁盘快得多)
缺点:
unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。虽然sock有更少的数据拷贝和上下文切换,更少的资源占用,但是如果数据都是错的,那还有什么用呢。另外使用sock的话,必须nginx和fpm在同一台机器上
tcp方式
优点:
从稳妥的考虑肯定是使用tcp,tcp协议能保证数据的正确性,sock不能保证。可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式
缺点:
性能不如unix socket
8.Nginx代理
nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。
server
{
listen 80;
server_name baidu.com;
location /
{
proxy_pass http://220.181.111.188/;
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:指定将请求代理至upstream server的URL路径;proxy_set_header:将发送至upsream server的报文的某首部进行重写;
扩展知识:NGINX location 在配置中的优先级
location表达式类型
- ~ 表示执行一个正则匹配,区分大小写
- ~* 表示执行一个正则匹配,不区分大小写
- ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
- = 进行普通字符精确匹配。也就是完全匹配。
- @ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location优先级说明
在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。
以下是按优先级排列说明:
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
- ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
- 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
- 常规字符串匹配类型。按前缀匹配。