Nginx常用命令和配置

1,077 阅读4分钟

下面的例子在ubuntu系统下管用,centos等其他系统可能会有细微区别

常用命令

# 安装, ubuntu系统为例,centos是其他命令
sudo apt-get install nginx

# 重启前先检查配置文件语法
nginx -t

# 如果没有报错,执行重启
nginx -s reload

常用配置

创建新站点

安装完nginx,会有sites-available和sites-enabled目录,只有在sites-enabled目录下创建的站点配置文件才会生效,但是我们一般在sites-available目录下站点配置文件,然后软链接到sites-enabled,这样有个好处是假设下面的 www.booking.com 站点不需要了,只需要删掉sites-enabled/www.booking.com文件即可,他只是链接文件,源文件还是在sites-available目录下面,方便还原。

sudo touch /etc/nginx/sites-available/www.booking.com
sudo ln -s /etc/nginx/sites-available/www.booking.com /etc/nginx/sites-enabled/

静态站点

server {
    listen 80;
    # 项目根目录
    root /var/www/www.test.com/public
    # 项目入口文件,按优先级依次匹配,先找index.html,如果找不到就找index.htm...
    index index.html index.htm index.nginx-debian.html;
    # 域名,需要先提前配置解析
    server_name test.com www.test.com;
    # 如果匹配地址失败返回404状态码
    location / {
     try_files $uri $uri/ =404;
   }
}

配置https

配置https需要先申请SSL证书,现在阿里云和腾讯云都可以申请免费1年的证书,我们可以在这些公有云上申请证书,安装在自己的服务器上面,Nginx 服务器 SSL 证书安装部署,文档比较详细,这里不在复述。

需要注意几点:

  1. 证书和域名相关,同一个域名可以申请多个证书
  2. 使用证书需要验证对应的域名的所有权,比如会让你在域名对应的根目录添加一个文件,可以正确访问到,最简单的方式DNS验证
  3. 在腾讯云上申请的证书没有只能应用在腾讯云购买服务器的限制,域名也不一定是在腾讯云购买的,当然都是用的同一家公有云的服务验证起来比较方便

basic认证

有些网站页面需要输入正确的用户名和密码才能打开

image.png

实现方法也比较简单

sudo apt-get install apache2-utils

cd /etc/nginx

# 使用htpasswd命令创建用户demo,密码123456文件名htpasswd的验证文件
sudo htpasswd -bc htpasswd demo 123456

# 编辑 nginx 站点配置文件

# 加入下面两行到 server 或 location 段中
auth_basic 'Restricted';  # 认证名称,随意填写 
auth_basic_user_file /usr/local/nginx/htpasswd; # 认证的密码文件,需要生成。

# 重启 nginx
sudo nginx -t && sudo nginx -s reload

显示目录文件列表

场景:有个存放每日备份数据库或日志的目录,希望显示列表,方便下载文件

image.png

location / {
   root /data/www/file                   //指定实际目录绝对路径;
   autoindex on;                         //开启目录浏览功能;
   autoindex_exact_size off;             //关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
   autoindex_localtime on;              //开启以服务器本地时区显示文件修改日期!
   charset utf-8,gbk;                   //避免中文乱码
}

另外,如果希望请求文件是下载而不是显示内容,可以通过添加下面参数实现: add_header Content-Disposition attachment;

反向代理

我们只需要记得正向代理代理的对象是客户端,最常见的就是FQ软件

反向代理代理的对象是服务端

客户端本来可以直接通过HTTP协议访问某网站应用服务器,如果网站管理员在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

例子:Nginx监听来自外部访问80的请求,转发给自己服务器占用18083端口的服务

server {
        listen 80;
        index index.html index.htm index.nginx-debian.html;
        server_name mqtt.demo.com;
        location / {
          proxy_pass  http://127.0.0.1:18083;
        }
}

php

server {
    listen 80;
    server_name foo.com;

    root /path;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi.conf;
        # 需要确保 /run/php/php7.2-fpm.sock 文件存在
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        # fastcgi_pass 127.0.0.1:9000;
    }
}

关于 try_files 指令

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        # $uri 是变量 如 www.xxx.com/aaa.php 则 $uri是aaa.php
        # 假设我们访问/a.php 先判断 a.php是不是文件,是返回
        # 如果不是再判断是不是目录($uri/),是返回
        # 如果都不是则返回404
        try_files $uri $uri/ =404;
    }

    #  所有的请求引导到index.php中
    try_files $uri $uri/   /index.php?$query_string  =404;

@ 符号的使用

@用于定义一个 location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files

c49fb81c8f9141ae3fe7f9db2da60bd7.htm 实际上个不存在的文件, 下面的含义的如果访问项目根目录或blog目录底下的以php结尾的文件都走php fpm解析流程

        location ~ \.php$ {
            try_files /c49fb81c8f9141ae3fe7f9db2da60bd7.htm @php;
        }

        location /blog/\.php$ {
            try_files /c49fb81c8f9141ae3fe7f9db2da60bd7.htm @php;
        }


        location @php {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/var/lib/php7.2-fpm/web10.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }

待补充 rewrite,location,alias,负载均衡,日志,其中rewrite,location,alias这三个最重要会单独讲