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";
}
}