nginx 基本配置和常用命令,每天一遍,防止健忘

1,388 阅读5分钟

前言

由于一些有的没的原因,在一设置了网闸的项目里,配置了一份路由转发,但是后续有另外的厂商,登录错服务器,把我的nginx都给覆盖替换了。当时蠢,没做备份,还是第一次用nginx,自己踩下去的坑,记录一下,防止以后再犯。也希望水文能给需要的人带来一点点帮助,也是极好的。

下载安装不必多说,直接上地址自取 nginx下载官网

1、简单使用,你需要关注的目录

nginx 的文件目录里,你需要关心的有:

  • html 放置你发布的前端包,比如 exampleWeb 文件夹,里面入口文件是 index.html
  • conf 就是nginx的配置文件夹,里面的 nginx.conf 文件就是需要你手动配置的;
  • logs 是nginx启动的日志,成功启动后会出现 nginx.pid 文件,出错信息会在error.log里;
  • nginx.exe 不必多说,双击启动。

2、配置nginx.conf

先来看张图

nginx配置图

nginx.conf 里 # 是注释符

worker_processes  1;

worker_processes,工作进程数,默认1,最高建议不超过CPU核心(线程)数(1足够了)

events {
    worker_connections  1024;
}

worker_connections,每个工作进程允许同时建立外部连接数,默认


主题内容大致分为以下区块 http块 -> server块 -> location块;http只有一个,下属可以有多个server块,每个server块下面可以有多个location块。http模块目前我使用的不多,就介绍下server和location的配置。

server和location的配置

每个server可以监听一个端口,比如我这里监听了listen 8082;,那么 IP:8082 的url就会走到这个server模块里面。
  • 我这个server里面有两个location模块,一个只有 / , 一个是/api/ (不要忘记后面的那个斜杠);因为我这里是放了一个Vue前端打包目录“pc”,放在nginx目录里的html中,并且后台服务部署在该机的5000端口。那么我至少需要配置两个location,一个用来代理web资源文件,一个代理跨域请求。
  • 第一个代理资源文件的,直接放在
location / { root html/pc;index index.html index.htm }

root 是你web的访问目录,如 html/pc,nginx默认从nginx.exe所在目录开始,访问相对路径 ;index 是入口文件名称。我直接使用了默认的,一般都不会改,即 index.html index.htm。

  • 第二个代理跨域请求,因为项目采用了前后分离模式,web的发布端口(即本文是8082),和后台服务的发布端口(即本文的5000)不同,会有跨域问题。所以需要nginx代理转发,为了区分普通的资源请求还是接口请求,前端一般要设置一个api接口前缀,本项目中用了直接用了api这个名称。所有后台接口请求的url,浏览器发出来,都会是ip:8082/api/getxxx。那么就会进入到这个location /api/ 块中,实现反向代理
proxy_pass http://ip:5000/  #后面的/加不加也是有区别的。本文这里要加。后面会举例区别。ip或端口末尾有斜杠的,会重写url。

这样请求的url,ip:8082/api/getxxx 就会变成 http://xxx:5000/getxxx;就成功访问到后台接口了 保存退出,重启nginx,那么一个web项目就成功发布出去了。可以通过ip:8082访问。

介绍下代理地址加不加 斜杠 / 的区别
第一组:
location /api/ {
    proxy_pass http://127.0.0.1:5000/;  # 本文用的有斜杠
}
末尾加了斜杠,那么会重写url里的 /api/ (你定义的 location ),
原来的 ip:8082/api/getxxx -> http://127.0.0.1:5000/getxxx
/api/ 被 / 取代


第二组:
location /api/ {
    proxy_pass http://127.0.0.1:5000;  #比第一组的末尾少一个斜杠 /
}
末尾不加/,不会重写url
原来的 ip:8082/api/getxxx -> http://127.0.0.1:5000/api/getxxx


第三组:
location /api/ {
    proxy_pass http://127.0.0.1:5000/BASE/; #多一个路径
}
原来的 ip:8082/api/getxxx -> http://127.0.0.1:5000/BASE/getxxx
加了 /BASE/,那么 /api/ 被 /BASE/ 重写


第四组
location /api/ {
    proxy_pass http://127.0.0.1:5000/BASE; #多一个路径,但少一个斜杠 
}
原来的 ip:8082/api/getxxx -> http://127.0.0.1:5000/BASEgetxxx
只加了 /BASE,那么 /api/ 被 /BASE 重写
这种写法尤其要注意!

同一个项目代理后台地址

依据上面第三组代理规则,我们可以为一个项目,代理多个后台服务地址,比如我有个项目中,调用了另外一个服务的一个方法;我们可以这么做

 server {
        listen       8082;
        server_name  localhost;
        location / {
            root   html/pc;
            index  index.html index.htm;
       }
       location /api/base/ {
         proxy_pass http://127.0.0.1:5000/base/;
       }
       location /api/biz/ {
         proxy_pass http://127.0.0.1:5000/biz/;
       }
       #这里调用了另外一个服务器的方法,该方法要注意区分api的路径
        location /api/sign/ {
         proxy_pass http://xxx.xxx.xxx.xxx:8091/sign/;
       }
   }

另外提一句,因为前端是vue开发的,所以我在vue.config.js里,如此设置开发环境的代理,以匹配上面的代理

 devServer: {
    // development server port 8000
    port: 8000,
    proxy: {
      '/api/biz': {
        target: 'http://localhost:5000',
        pathRewrite: { '^/api/biz': '/biz' }
        // 路径重写,注意和 匹配字符,如果我这里写了 /api/biz/,那么就要写  /biz/ 替换
        // 反正就是注意最后面一个斜杠
      },
      '/api/base': {
        target: 'http://localhost:5000',
        pathRewrite: { '^/api/base': '/base' }
      },
      '/api/sign/': {
        target: 'http://xxx.xxx.xxx.xxx:8091',
        pathRewrite: { '^/api/sign': '/sign' }
      }
    }
  }
 

本文完 nginx还可以配置内外网隔离的网络环境下,需要外网访问,获取内网数据的项目发布,并且还有上传下载文件等的配置。下次再介绍 (咕咕咕)。

nginx 常用命令

具体命令我不一一列举了,直接查官网手册。这里我只是记录一下自己常用的,提醒我自己。

nginx -s reopen #重启Nginx

nginx -s reload #重新加载Nginx配置文件,修改完配置文件后,经常使用

nginx -s quit #处理完所有请求后再停止服务

nginx -s stop #强制停止Nginx服务

nginx -t #检测配置文件是否有语法错误,然后退出

nginx -?,-h #打开帮助信息

nginx -v #显示版本信息并退出