Nginx常见问题

错误日志关键字

# 参数详情
include fastcgi_params
php内置变量文件:
    - $document_root
    - $fastcgi_script_name
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_sript_name;
fastcgi_param HTTPS on;  前端使用ssl时,才可以添加

include proxy_params
代理的优化:
- 请求头带着域名访问后端
- 透传用户的IP地址到后端
- 缓存的大小
- 超时时间

日志关键字:
error             # 错误
exception         # 例外
unknown           # 未知命令
not found         # 未找到
connect refused   # 拒绝
permission denied #权限不足

nginx 多 server优先级

## 优先级匹配顺序
1.首先选择所有的字符串完全匹配(精确匹配)的server_name。(完全匹配)
2.选择通配符在前面的server_name
3.选择通配符在后面的server_name
4.正则表达式的server_name
5.所有匹配规则相同时,哪个配置文件listen...后面加了default_server哪个优先级就最高
6.按照配置文件的顺序访问第一个配置文件

# 正则表达式
[root@web01 conf.d]# vim 1.conf
server {
    listen 80;
    server_name ~^(?<www>.+)\.howtocn\.org;
    root /code/1;
    index index.html;
}

# 完全匹配
[root@web01 conf.d]# cat 2.conf
server {
    listen 80;
    server_name www.hg.com;
    root /code/2;
    index index.html;
}

# 通配符
[root@web01 conf.d]# cat 3.conf
server {
    listen 80;
    server_name *.hg.com;
    root /code/3;
    index index.html;
}

# ip访问
[root@web01 conf.d]# cat 4.conf
server {
    listen 80;
    server_name _;
    root /code/4;
    index index.html;
}

禁止IP访问

## 禁止IP访问,并返回错误页面
[root@web01 ~]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    default_type text/json;
    return 500 "页面500 ,给爷爬~";
}

server {
    listen 80;
    server_name www.hg.com;
    root /code/2;
    index index.html;
}

## 禁止IP访问,并跳转到主站点
[root@web01 code]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    rewrite (.*) http://www.hg.com$1 redirect;
}

server {
    listen 80;
    server_name www.hg.com;
    root /code/2;
    index index.html;
}

nginx包含其他子配置文件include

include /etc/ngxinx/stream.d/*.conf

include /etc/nginx/fastcgi_params

include /etc/nginx/proxy_parmas ## 自己创建的 代理优化参数

## 可以创建一个需要生效的配置文件 把要生效的配置放到这个目录
[root@web01 conf.d]# mkdir /etc/nginx/conf.d/online

## 创建一个不需要生效的配置文件 把不要生效的配置放到这个目录
[root@web01 conf.d]# mkdir /etc/nginx/conf.d/offline

## 修改nginx主配置文件 把include指定的文件替换如下
include /etc/nginx/conf.d/online/*.conf;

站点目录路径 root和 alias区别

## 1.root指定站点目录
[root@web01 code]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    rewrite (.*) http://www.hg.com$1 redirect;
}

server {
    listen 80;
    server_name www.hg.com;

    location / {
        root /code/2;
        index index.html;
}

    location ~ /images {
        root /code/images;
    }
}

# 此时系统去找的图片路径为 /code/images/images/1.png 它会去root指定的目录下 找location指定目录下的文件

## 2.alias指定站点目录
[root@web01 code]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    rewrite (.*) http://www.hg.com$1 redirect;
}

server {
    listen 80;
    server_name www.hg.com;
    root /code/2;
    index index.html;

    location /images {
        alias /images;
    }
}

location /images {
alias /code/images;
}

# 此时系统去找的图片路径为 /code/images/1.png 它始终会去alias指定的目录下找文件

Nginx try_file路径匹配

[root@web01 code]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    rewrite (.*) http://www.hg.com$1 redirect;
}

server {
    listen 80;
    server_name www.hg.com;
    root /code;
    index index.html;

    location / {
        try_files $uri $uri/ @hg;
    }

    location @hg {
        proxy_pass http://172.16.1.8:8080;
    }
}
# 此时系统会先去$uri也就是你指定的uri找index.html文件
# 要是没有index.html文件 就会把$uri/ 也就是index.html当成一个目录 去这个目录下找文件
# 要是这个目录下也没有文件 就根据 @hg 去找指定的下面的location 然后输出location例指定的内容

nginx 调整上传文件的大小

# 在nginx主配置文件中http层添加以下内容
[root@web01 ~]# vim /etc/nginx/nginx.conf
http{
    Syntax: client_max_body_size size;
    Default: client_max_body_size 1m;
    Context: http, server, location
    ...
}

隐藏nginx版本号

# 在nginx主配置文件中http层添加以下内容
[root@web01 ~]# vim /etc/nginx/nginx.conf
http{
    server_tokens off;
    ...
}

nginx优雅的显示404错误页面

## 跳转页面
[root@web01 code]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    rewrite (.*) http://www.hg.com$1 redirect;
}

server {
    listen 80;
    server_name www.hg.com;

    location / {
        root /code;
        index index.html;
        error_page 404 http://www.baidu.com;
    }
}

## 前端页面
[root@web01 code]# vim /etc/nginx/conf.d/ip.conf
server {
    listen 80 default_server;
    server_name _;
    charset utf-8;
    rewrite (.*) http://www.hg.com$1 redirect;
}

server {
    listen 80;
    server_name www.hg.com;

    location / {
        root /code;
        index index.html;
        error_page 404 /404.html;
    }
}

## 前端图片页面案例
[root@web01 code]# vim /code/404.html
<img style='width:100%;height:100%;'
src=https://www.wodeyumengouwo.com/picture/404.jpg>

[root@web01 code]# vim /code/404.html
<html>
<head>
<meta charset="utf-8">
<title>错误页面</title>
</head>
<body>
<center><h1 style='background-color:red'>给爷爬~ 瞎访问,没有这个页面</h1></center>
<img style='width:100%;height:100%;'
src=https://www.wodeyumengouwo.com/picture/404.jpg>
</body>
</html>

nginx优化选项

## 静态资源读取
# 文件读取高效sendfile
tcp_nopush on;
# 将多个包一次发送,用于提升网络传输效率,大文件推荐打开,需要开启sendfile才行
Syntax: tcp_nopush on;
# 提高网络传输实时性,需要开启keepalive,来一个包发一个包不等待行
tcp_nodelay on;

## 静态资源压缩
# gzip传输压缩,传输前压缩,传输后解压
gzip on;
# 指定gzip压缩哪些类型文件
gzip_types  image/jpeg image/gif image/png;
# gzip压缩比率,加快传输,但压缩本身比较耗费服务器性能
gzip_comp_level 2;
# gzip压缩协议版本,压缩使用在http哪个协议,主流选择1.1版本
gzip_http_version 1.1;

#防盗链demo
location / {
    root /code/wordpress/bktp;
    valid_referers none blocked server_name *.blackgoatking.com;
    if ($invalid_referer){
    rewrite ^(.*)$ /fdltpk/1656065486157.png break;
}

nginx通用优化

[root@nginx ~]# cat nginx.conf
user www;                   # nginx进程启动用户
worker_processes auto;      # 与cpu核心一致即可
worker_cpu_affinity auto;   # cpu亲和

error_log /var/log/nginx/error.log warn;    # 错误日志
pid /run/nginx.pid;
worker_rlimit_nofile 35535;     # 每个work能打开的文件描述符,调整至1w以上,负荷较高建议2-3w

events {
    use epoll;                  # 使用epoll高效网络模型
    worker_connections 10240;   # 限制每个进程能处理多少个连接,10240x[cpu核心]
}

http {
    include             mime.types;
    default_type        application/octet-stream;
    charset utf-8;      # 统一使用utf-8字符集

    # 定义日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 定义json日志格式              
    log_format json_access '{"@timestamp":"$time_iso8601",'
                      '"host":"$server_addr",'
                      '"clientip":"$remote_addr",'
                      '"size":$body_bytes_sent,'
                      '"responsetime":$request_time,'
                      '"upstreamtime":"$upstream_response_time",'
                      '"upstreamhost":"$upstream_addr",'
                      '"http_host":"$host",'
                      '"url":"$uri",'
                      '"domain":"$host",'
                      '"xff":"$http_x_forwarded_for",'
                      '"referer":"$http_referer",'
                      '"status":"$status"}';

    access_log  /var/log/nginx/access.log  main;    # 访问日志

    server_tokens off;  # 禁止浏览器显示nginx版本号
    client_max_body_size 200m;  # 文件上传大小限制调整

    # 文件高效传输,静态资源服务器建议打开
    sendfile            on;
    tcp_nopush          on;
    # 文件实时传输,动态资源服务建议打开,需要打开keepalive
    tcp_nodelay         on;
    keepalive_timeout   65;

    # Gzip 压缩
    gzip on;
    gzip_disable "MSIE [1-6]\.";    # 针对IE浏览器不进行压缩
    gzip_http_version 1.1;
    gzip_comp_level 2;      # 压缩级别
    gzip_buffers 16 8k;     # 压缩的缓冲区
    gzip_min_length 1024;   # 文件大于1024字节才进行压缩,默认值20
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;

    # 虚拟主机
    include /etc/nginx/conf.d/*.conf;
}

PHP服务优化

## php程序配置管理文件/etc/php.ini,主要调整日志、文件上传、禁止危险函数、关闭版本号显示等

#;;;;;;;;;;;;;;;;;
# Error  logging ;  #错误日志设置
#;;;;;;;;;;;;;;;;;
expose_php = Off                        # 关闭php版本信息
display_error = Off                     # 屏幕不显示错误日志
error_reporting = E_ALL                 # 记录PHP的每个错误
log_errors = On                         # 开启错误日志
error_log = /var/log/php_error.log      # 错误日志写入的位置
date.timezone = Asia/Shanghai           # 调整时区,默认PRC

#;;;;;;;;;;;;;;;
# File Uploads ;    #文件上传设置
#;;;;;;;;;;;;;;;
file_uploads = On           # 允许文件上传
upload_max_filesize = 300M  # 允许上传文件的最大大小
post_max_size = 300M        # 允许客户端单个POST请求发送的最大数据
max_file_uploads = 20       # 允许同时上传的文件的最大数量
memory_limit = 128M         # 每个脚本执行最大内存

[Session]       #会话共享
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379"

#php禁止危险函数执行(取决于实际情况,需要和开发沟通)
disable_functions = chown,chmod,pfsockopen,phpinfo