Skip to content

Nginx 的基础语法

Nginx 的主配置文件在这个目录: /etc/nginx/nginx.conf。配置文件的结构如下:

nginx
main        # 全局配置,对全局生效
├── events  # 配置影响 Nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

# 一个 Nginx 配置文件的结构就像 nginx.conf 显示的那样,配置文件的语法规则:
# 配置文件由指令与指令块构成;
# 每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;
# 指令块以 {} 大括号将多条指令组织在一起;
# include 语句允许组合多个配置文件以提升可维护性;
# 使用 # 符号添加注释,提高可读性;
# 使用 $ 符号使用变量;
# 部分指令的参数支持正则表达式;

Nginx 的默认记录

千万要注意:nginx 的配置每一行的行尾必须有分号!

nginx
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
		# 载入指定路径的所有nginx的配置
    include /etc/nginx/conf.d/*.conf;
}

主站的 Nginx 配置和 https 配置

nginx
server {
        listen       80;
        server_name  www.cghbh.com cghbh.com;
        # 强制重定向到https的协议
        return 301 https://$server_name$request_uri;
    }

    server {
        #SSL 默认访问端口号为 443
        listen 443 http2;
        ssl on;
        #请填写绑定证书的域名
        server_name www.cghbh.com;
        #请填写证书文件的相对路径或绝对路径
        ssl_certificate /etc/nginx/cert/main/www.cghbh.com_bundle.crt;
        #请填写私钥文件的相对路径或绝对路径
        ssl_certificate_key /etc/nginx/cert/main/www.cghbh.com.key;
        ssl_session_timeout 5m;
        #请按照以下协议配置
        ssl_protocols TLSv1.2 TLSv1.3;
        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        location / {
            #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
            #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
            root   /etc/nginx/demo/main;
    		index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
    }

使用 Nginx 适配 PC 端和移动端

nginx
# /etc/nginx/conf.d/terminal.conf
server {
  # 监听8888端口的访问
  listen 8888;
  # 访问域名
	server_name www.cghbh.com;
  # z注意:在nginx中,语法规范的前提下,先书写的代码先生效,不会出现后面的覆盖前面的情况
	location / {
		root  /etc/nginx/html/pc;
    # 如果是移动端,走单独的页面
    if ($http_user_agent ~* '(Android|webOS|iPhone|iPad|iPod|BlackBerry|opera mini|opera mobile|appleWebkit.*mobile|mobile)') {
      root /etc/nginx/html/mobile;
    }
    # 否则走默认的PC端页面
		index index.html;
	}
}

Nginx 日志统计

shell
# 统计Nginx的所有PV数
cat /var/log/nginx/access.log | wc -l

# 统计当天的PV
cat /var/log/nginx/access.log | sed -n /`date "+%d\/%b\/%Y"`/p | wc -l

#  按照ip请求次数统计
cat /var/log/nginx/access.log |awk '{print $1}'|sort -nr |uniq -c |sort -nr |more

# 统计有多少个IP访问了nginx服务器
awk '{print $1}' /var/log/nginx/access.log | sort -n | uniq | wc -l

# 查看访问最频繁的前100个IP
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c | sort -rn | head -n 100

# 统计访问次数大于100次的IP,其他的情况以此类推
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

当前的服务器记录

  • 139.198.177.30 青云平台
  • 59.36.169.39 天翼云平台

Nginx 变量大全

shell
$args                    #请求中的参数值
$query_string            #同 $args
$arg_NAME                #GET请求中NAME的值
$is_args                 #如果请求中有参数,值为"?",否则为空字符串
$uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #当前请求的文档根目录或别名
$host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname                #主机名
$https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent              #传输给客户端的字节数
$connection              #TCP连接的序列号
$connection_requests     #TCP连接当前的请求数量
$content_length          #"Content-Length" 请求头字段
$content_type            #"Content-Type" 请求头字段
$cookie_name             #cookie名称
$limit_rate              #用于设置响应的速度限制
$msec                    #当前的Unix时间戳
$nginx_version           #nginx版本
$pid                     #工作进程的PID
$pipe                    #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr             #客户端地址
$remote_port             #客户端端口
$remote_user             #用于HTTP基础认证服务的用户名
$request                 #代表客户端的请求地址
$request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file       #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method          #HTTP请求方法,通常为"GET"或"POST"
$request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #请求使用的Web协议,"http" 或 "https"
$server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name             #服务器名
$server_port             #服务器端口
$server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status                  #HTTP响应代码
$time_iso8601            #服务器时间的ISO 8610格式
$time_local              #服务器时间(LOG Format 格式)
$cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent         #用户终端浏览器等信息
$http_x_forwarded_for
$sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding

前端要实现一个长按图片下载的功能,要求访问图片的时候在返回的文件头加上点东西:

nginx
location ~* \.(png|jpg|jpeg|gif)$ {
    add_header Access-Control-Allow-Origin "*"; #此处解决跨域调用问题,之前前端要画图配置的
    if ($args = "down") { #nginx的if语句有大坑,所以需要重新配置跨域
        add_header Access-Control-Allow-Origin "*"; #不加这一行前面的莫名奇妙会消失
        add_header content-disposition "attachment";
    }
}