zhangdizhangdi

Nginx

文档

安装

bash
$ yum install nginx

默认文件位置

  • 配置文件夹:/etc/nginx/
  • log文件夹:/var/log/nginx/

常用指令

bash
service nginx stop
service nginx start
service nginx restart
service nginx reload

nginx -t
nginx -s stop
nginx -s quit
nginx -s reload
nginx -s reopen
ps -ax | grep nginx
kill -s QUIT $id

# 设置开机启动
systemctl enable nginx.service

reload 异常

sh
$ nginx -s reload
nginx: [error] invalid PID number "" in "/run/nginx.pid"

/run/nginx.pid文件为空,或者不是当前的主进程号了。

sh
# 查看配置文件的地址
$ nginx -t

# 重新加载配置文件,再执行reload
$ nginx -c /etc/nginx/nginx.conf
$ nginx -s reload

常用配置

禁止未绑定域名访问

比如通过ip地址访问

nginx
server {
  listen 80 default_server;
  server_name _;
  return 403;
}

配置 https,并开启 http2

腾讯云账号可以申请50个证书,单个域名,有效期3个月,过期重新申请。

  • 将已获取到的域名_bundle.crt证书文件和域名.key私钥文件从本地目录拷贝到服务器的/etc/nginx目录下
  • 编辑nginx.conf文件
nginx
server {
    listen 443 ssl http2;
    server_name 域名;
    ssl_certificate 域名_bundle.crt;
    ssl_certificate_key 域名.key;
}

http 跳转到 https

nginx
server {
    listen 80;
    server_name 域名;
    return 301 https://$host$request_uri;
}

反向代理

nginx
server {
  listen            80;
  server_name       xxxx.zdzhangdi.cn;
  server_tokens     off;

  location / {
      allow         xxx;
      deny          all;

      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                 http://localhost:xxx;
  }
}

root和alias

  • root:root路径+location路径
  • alias:使用alias路径替换location路径,后面必须要用“/”结束,只能放在locaiton中
nginx
location / {
	root /zd-web/www/;
}
# /projects/server/nginx.html -> /zd-web/www/projects/server/nginx.html

location /note/ {
	alias /zd-web/www-note/;
}
# /note/course.html -> /zd-web/www-note/course.html

try_files

  • 路径是需要按照给定的root或alias为根路径来查找
  • 按顺序匹配,使用第一个找到的文件
  • 如果没有找到,返回404;如果最后一个不是404,则返回最后配置的文件
nginx
root       /home/www/xxx;
try_files  $uri $uri/index.html /index.html =404;

# 如果访问的是`https://test.zdzhangdi.cn/projects/server/nginx`,依次寻找的是:
# 1. /home/www/xxx/projects/server/nginx
# 2. /home/www/xxx/projects/server/index.html
# 3. /home/www/xxx/index.html

防盗与缓存

nginx
location ~* \.(jpg|jpeg|png|svg|gif|ico)$ {
  add_header Cache-Control "public;max-age=2592000";

  valid_referers    域名;
  if ($invalid_referer) {
    return 404;
  }
}

禁止 iframe 引用

nginx
# http 或 server 中添加
add_header X-Frame-Options SAMEORIGIN;

配置记录

匹配符 匹配方式 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写的不匹配正则 5
!~* 不区分大小写的不匹配正则 6
/ 通用匹配,任何请求都会匹配到 7
说明
$args 请求中的参数
$content_length HTTP请求信息里的"Content-Length"
$content_type 请求信息里的"Content-Type"
$document_root 针对当前请求的根路径设置值
$document_uri 与$uri相同
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名
$limit_rate 对连接速率的限制
$request_method 请求的方法,比如"GET"、"POST"等
$remote_addr 客户端地址
$remote_port 客户端端口号
$remote_user 客户端用户名,认证用
$request_filename 当前请求的文件路径名
$request_body_file 前请求的文件
$request_uri 请求的URI,带查询字符串
$query_string 与$args相同
$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect
$server_protocol 请求的协议版本,“HTTP/1.0"或"HTTP/1.1”
$server_addr 服务器地址
$server_name 请求到达的服务器名
$server_port 请求到达的服务器端口号
$uri 请求的URI,可能和最初的值有不同,比如经过重定向之类的

遇到问题

📝 设置普通用户启动 nginx

nginx 的 user 使用的是默认 nobody,用普通用户上传到自己目录下,启动后一直 403,暂时将 user 设为了 root