1.概述
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。
2.工作模式
nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。
- master-worker
该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:
1、稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
2、配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
3、处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启) - 单进程模式:
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)
3.配置文件结构
user www www;
#程序运行用户和组
worker_processes auto;
#启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目
error_log /home/wwwlogs/nginx_error.log crit;
#全局错误日志
pid /usr/local/nginx/logs/nginx.pid;
#主进程PID保存文件
worker_rlimit_nofile 51200;
#文件描述符数量
events
{
use epoll;
#使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 51200;
#工作进程的最大连接数量
}
http{
#网站优化参数
server { #具体的某一网站的配置信息
listen 80;#监听端口
root html;#网页根目录(/usr/local/nginx/html)
server_name www.atguigu.com;#服务器域名
indexindex.html;#默认加载页面
access_log logs/access.log;#访问日志保存位置
location (.*)\.php$ {
#用正则匹配具体的访问对象;
}
location {
#跳转等规则;
}
}
server {
#虚拟主机;
}
}
Nginx相关实验
<注意事项>
- 注意配置文件中的结尾有;作为结束~!(切记!)
- 每次实验修改完配置文件后需要重启nginx才会生效
#pkill -HUPnginx
实验1:Nginx的状态统计
a、安装nginx时将–with-http_stub_status_module 模块开启
b、修改nginx配置文件(写入要访问的server标签中)
location /nginx_status{
stub_status on;
access_log off;
}
c、客户端访问网址:http://IP/nginx_status
"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息;
三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数。
实验2:目录保护
a、原理和apache的目录保护原理一样(利用上一个实验接着完成)
b、在状态统计的location中添加:
auth_basic "Welcome to nginx_status!";
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;
c、使用http的命令htpasswd进行用户密码文件的创建(生成在上面指定的位置)
#htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
d、重启nginx并再次访问统计页面
实验3:基于IP的身份验证(访问控制)
a、接着上一个实验完成操作
b、在状态统计的location中添加
allow 192.168.88.1;
deny 192.168.88.0/24;
仅允许192.168.88.1访问服务器
实验4:nginx的虚拟主机(基于域名)
a、提前准备好两个网站的域名,并且规划好两个网站网页存放目录
b、在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息
server{
listen 80;
server_name blog.atguigu.com;
index index.html index.htm index.php;
root html/blog;
access_log logs/blog-access.log main;
}
server{
listen 80;
server_name bbs.atguigu.com;
index index.html index.htm index.php;
root html/bbs;
access_log logs/bbs-access.log main;
}
c、分别访问两个不同的域名验证结果
实验5:nginx的反向代理
代理和反向代理?
代理:找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端
反向代理:替厂家卖东西的人就叫反向代理(烟酒代理),代理的对象是服务器端
a、在另外一台机器上安装apache,启动并填写测试页面
b、在nginx服务器的配置文件中添加(写在某一个网站的server标签内)
location / {
proxy_pass http://192.168.88.100:80;#此处填写apache服务器的IP地址
}
c、重启nginx,并使用客户端访问测试
实验6:负载调度(负载均衡)
负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
a、使用默认的rr轮训算法,修改nginx配置文件
upstream bbs { #此标签在server标签前添加
server 192.168.88.100:80;
server 192.168.88.200:80;
}
server {
........;
#修改自带的location / 的标签,将原内容删除,添加下列两项
location / {
proxy_pass http://bbs; #添加反向代理,代理地址填写upstream声明的名字
proxy_set_headerHost$host; #重写请求头部,保证网站所有页面都可访问成功
}
}
c、开启并设置两台88.100 & 88.200的主机
安装apache并设置不同的index.html页面内容(设置不同页面是为了看实验效果)
d、重启nginx,并使用客户端访问测试
拓展补充:rr算法实现加权轮询(后期集群再讲更多算法类型和功能)
upstream bbs{
server 192.168.88.100:80 weight=1;
server 192.168.88.200:80 weight=2;
}
实验7:nginx实现https {证书+rewrite}
a、安装nginx时,需要将–with-http_ssl_module 模块开启
b、在对应要进行加密的server标签中添加以下内容开启SSL
server {
.......;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/atguigu.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/atguigu.key;
ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
}
c、生成证书和秘钥文件
注意:在实验环境中可以用命令生成测试,在生产环境中必须要在https证书厂商注册
#openssl genrsa -out atguigu.key 1024
建立服务器私钥,生成RSA密钥
#openssl req -new -key atguigu.key -out atguigu.csr
需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。如果为了
https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
#openssl x509 -req -days 365 -sha256 -in atguigu.csr -signkey atguigu.key -out atguigu.crt
生成签字证书
#cp atguigu.crt /usr/local/nginx/conf/ssl/atguigu.crt
#cpatguigu.key /usr/local/nginx/conf/ssl/atguigu.key
将私钥和证书复制到指定位置
d、设置http自动跳转https功能
原有的server标签修改监听端口
server {
..........;
listen 443;
}
新增以下server标签(利用虚拟主机+rewrite的功能)
server{
listen 80;
server_name bbs.atguigu.com;
rewrite ^(.*)$ https://bbs.atguigu.compermanent;
root html;
index index.html index.htm;
}
e、重启nginx,并测试
Nginx配置文件详解
user www www; #程序运行用户和组
worker_processes auto; #启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目
error_log /home/wwwlogs/nginx_error.log crit; #全局错误日志
pid /usr/local/nginx/logs/nginx.pid; #主进程PID保存文件
worker_rlimit_nofile 51200; #文件描述符数量
events {
use epoll; #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 51200; #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}
http { #整体环境配置--网站配置
include mime.types;
default_type application/octet-stream; #设定mime类型,文件传送类型由mime.type文件定义
server_names_hash_bucket_size 128; #保存服务器名字的hash表大小
client_header_buffer_size 32k; #客户端请求头部缓冲区大小
large_client_header_buffers 4 32k; #最大客户端头缓冲大小
client_max_body_size 50m; #客户端最大上传文件大小(M)
sendfile on; #sendfile 指令指定nginx 是否调用sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
tcp_nopush on; #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)
keepalive_timeout 60; #连接超时时间
tcp_nodelay on; #禁用nagle算法,也即不缓存数据。有效解决网络阻塞
#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 256k;
gzip on;gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.server_tokens off;
#隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)
#定义日志格式
#log format
log_format access '$remote_addr -$remote_user [$time_local] "$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';
server {
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on; #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
server_name www.lnmp.org lnmp.org; #服务器名,可以写多个域名,用空格分隔
index index.html index.htm index.php;#默认网页文件
root /home/wwwroot/default;#网页主目录
#error_page 404 /404.html;
include enable-php.conf;
#开启status状态监测
location /nginx_status {
stub_status on;
access_log off;
}
#静态文件处理,保存期30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
#js和css文件处理,保存期12小时
location ~ .*\.(js|css)?$ {
expires 12h;
}
location~ /\. {
deny all;
}
#正确访问日志
access_log /home/wwwlogs/access.log access;
}
include vhost/*.conf; #vhost/下子配置文件生效
}
Nginx的应用场景
HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
1、首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个index.html;
2、配置nginx.conf中的server
user mengday staff;
http {
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
# 默认location
location / {
root /usr/local/var/www/html;
index index.html index.htm;
}
}
}
3、访问测试
- http://localhost/ 指向/usr/local/var/www/index.html, index.html是安装nginx自带的html
- http://localhost/test.html 指向/usr/local/var/www/html/test.html
注意:如果访问图片出现403 Forbidden错误,可能是因为nginx.conf 的第一行user配置不对,默认是#user nobody;是注释的,linux下改成user root; macos下改成user 用户名 所在组; 然后重新加载配置文件或者重启,再试一下就可以了, 用户名可以通过who am i 命令来查看。
4、指令简介
- server : 用于定义服务,http中可以有多个server块
- listen : 指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口
- server_name : 服务名称,用于配置域名
- location : 用于配置映射路径uri对应的配置,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码
- root : 根路径,当访问http://localhost/test.html,“/test.html”会匹配到”/”uri, 找到root为/usr/local/var/www/html,用户访问的资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
- index : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html
5、location uri正则表达式
- . :匹配除换行符以外的任意字符
- ? :重复0次或1次
-
- :重复1次或更多次
-
- :重复0次或更多次
- \d :匹配数字
- ^ :匹配字符串的开始
- $ :匹配字符串的结束
- {n} :重复n次
- {n,} :重复n次或更多次
- [c] :匹配单个字符c
- [a-z] :匹配a-z小写字母的任意一个
- (a|b|c) : 属线表示匹配任意一种情况,每种情况使用竖线分隔,一般使用小括号括括住,匹配符合a字符 或是b字符 或是c字符的字符串
- \ 反斜杠:用于转义特殊字符
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
静态服务器
在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。
1、在/usr/local/var/www 下分别创建images和img目录,分别在每个目录下放一张test.jpg
http {
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/var/www;
# 默认location
location / {
root /usr/local/var/www/html;
index index.html index.htm;
}
location ^~ /images/ {
root $doc_root;
}
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
}
}
自定义变量使用set指令,语法 set 变量名值;引用使用变量名值;引用使用变量名; 这里自定义了doc_root变量。
静态服务器location的映射一般有两种方式:
- 使用路径,如 /images/ 一般图片都会放在某个图片目录下,
- 使用后缀,如 .jpg、.png 等后缀匹配模式
访问http://localhost/test.jpg 会映射到 $doc_root/img
访问http://localhost/images/test.jpg 当同一个路径满足多个location时,优先匹配优先级高的location,由于^~ 的优先级大于 ~, 所以会走/images/对应的location
常见的location路径映射路径有以下几种:
- = 进行普通字符精确匹配。也就是完全匹配。
- ^~ 前缀匹配。如果匹配成功,则不再匹配其他location。
- ~ 表示执行一个正则匹配,区分大小写
- ~* 表示执行一个正则匹配,不区分大小写
- /xxx/ 常规字符串路径匹配
- / 通用匹配,任何请求都会匹配到
location优先级
当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。
以下是按优先级排列说明:
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。
- ^~类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。
- 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
- 常规字符串匹配类型。按前缀匹配。
- / 通用匹配,如果没有匹配到,就匹配通用的
优先级搜索问题:不同类型的location映射决定是否继续向下搜索
- 等号类型、^~类型:一旦匹配上就停止搜索了,不会再匹配其他location了
- 正则表达式类型(~ ~*),常规字符串匹配类型/xxx/ : 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索
location优先级从高到底:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
location = / {
# 精确匹配/,主机名后面不能带任何字符串 /
[ configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
# 所以,即便有符合的正则表达式location,也不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。
# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,还会继续往下搜索
[ configuration F ]
}
location = /test.htm {
root /usr/local/var/www/htm;
index index.htm;
}
注意:location的优先级与location配置的位置无关
反向代理
反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
反向代理通过proxy_pass指令来实现。
启动一个Java Web项目,端口号为8081
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host:$server_port;
# 设置用户ip地址
proxy_set_header X-Forwarded-For $remote_addr;
# 当请求服务器出错去寻找其他服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
当我们访问localhost的时候,就相当于访问 localhost:8081了
负载均衡
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
负载均衡通过upstream指令来实现。
- RR(round robin :轮询 默认)
每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上,如果只有两台服务器,第三次请求继续分配到第一台上,这样循环轮询下去,也就是服务器接收请求的比例是 1:1, 如果后端服务器down掉,能自动剔除。轮询是默认配置,不需要太多的配置
同一个项目分别使用8081和8082端口启动项目
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
#access_log logs/host.access.log main;
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
}
访问地址仍然可以获得响应 http://localhost/api/user/login?username=zhangsan&password=111111 ,这种方式是轮询的
- 权重
指定轮询几率,weight和访问比率成正比, 也就是服务器接收请求的比例就是各自配置的weight的比例,用于后端服务器性能不均的情况,比如服务器性能差点就少接收点请求,服务器性能好点就多处理点请求。
upstream test {
server localhost:8081 weight=1;
server localhost:8082 weight=3;
server localhost:8083 weight=4 backup;
}
示例是4次请求只有一次被分配到8081上,其他3次分配到8082上。backup是指热备,只有当8081和8082都宕机的情况下才走8083
- ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个配置是为了更快的给用户响应
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
- url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。
动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/var/www;
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $doc_root;
}
}
其他
- return指令
返回http状态码 和 可选的第二个参数可以是重定向的URL
location /permanently/moved/url {
return 301 http://www.example.com/moved/here;
}
- rewrite指令
重写URI请求 rewrite,通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。
第一个(必需)参数是请求URI必须匹配的正则表达式。
第二个参数是用于替换匹配URI的URI。
可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301或302)的标志
location /users/ {
rewrite ^/users/(.*)$ /show?user=$1 break;
}
- error_page指令
使用error_page指令,您可以配置NGINX返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他URI。在以下示例中,error_page指令指定要返回404页面错误代码的页面(/404.html)。
error_page 404 /404.html;
- 日志
访问日志:需要开启压缩 gzip on; 否则不生成日志文件,打开log_format、access_log注释
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/etc/nginx/logs/host.access.log main;
gzip on;
- deny 指令
# 禁止访问某个目录
location ~* \.(txt|doc)${
root $doc_root;
deny all;
}
- 内置变量
nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。
- a r g s : 这 个 变 量 等 于 请 求 行 中 的 参 数 , 同 args :这个变量等于请求行中的参数,同 args:这个变量等于请求行中的参数,同query_string
- $content_length :请求头中的Content-length字段。
- $content_type :请求头中的Content-Type字段。
- $document_root :当前请求在root指令中指定的值。
- $host :请求主机头字段,否则为服务器名称。
- $http_user_agent :客户端agent信息
- $http_cookie :客户端cookie信息
- $limit_rate :这个变量可以限制连接速率。
- $request_method :客户端请求的动作,通常为GET或POST。
- $remote_addr :客户端的IP地址。
- $remote_port :客户端的端口。
- $remote_user :已经经过Auth Basic Module验证的用户名。
- $request_filename :当前请求的文件路径,由root或alias指令与URI请求生成。
- $scheme :HTTP方法(如http,https)。
- $server_protocol :请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
- $server_addr :服务器地址,在完成一次系统调用后可以确定这个值。
- $server_name :服务器名称。
- $server_port :请求到达服务器的端口号。
- $request_uri :包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
- u r i : 不 带 请 求 参 数 的 当 前 U R I , uri :不带请求参数的当前URI, uri:不带请求参数的当前URI,uri不包含主机名,如”/foo/bar.html”。
- d o c u m e n t u r i : 与 document_uri :与 documenturi:与uri相同