ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、概述 ``` /usr/local/nginx/conf/nginx.conf ``` ![](https://img.kancloud.cn/88/c4/88c4e8b92f3b99123f6a0550adfcdea6_1092x86.png) ![](https://img.kancloud.cn/3f/08/3f08c83b0dc3fec85842847ab110529f_201x373.png) 配置文件主要由三大部分组成:main(全局设置),events(Nginx 服务器与用户的网络连接配置),http(核心设置); ## 二、普通web部署 部署普通的网页,直接将文件扔到nginx根目录下的html文件夹,即可; ### **根应用部署** 如果需要部署为根应用,也简单得很,就是把html文件夹删除,直接把应用最外层名字命名为html即可; 或者修改根应用的目录 ![](https://img.kancloud.cn/9a/32/9a326ab2d1dba7de496314992dd9a19f_396x108.png) 原本默认的`root html`改为`root html/mobile` ### **自定义部署** 例如,需要把应用的访问名称按照自己的需要来定义,可以用alias实现; ``` location /admin/ { alias /usr/lib/app/nginx/html/admin/; index index.html index.htm; } ``` 这样访问http://dns/admin就可以访问到`/usr/lib/app/nginx/html/admin/`下的应用了; ## 三、反向代理部署 后端的web应用部署在tomcat中,假定访问地址: ``` http://192.168.3.149:8080 ``` 首先配置上游服务器(http{}段): ``` upstream backend { server www.ray.org:8099; } ``` server 中配置(server{}段): ``` location / { root html; index index.html index.htm; proxy_pass http://backend; } location ~ .* { proxy_pass http://backend; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for; } ``` 即可实现在浏览器输入:`http://localhost/`,转发到地址`http://www.ray.org:8099` ## 四、前后端分离部署 前端部署在nginx,后端部署在tomcat等服务容器的情形; 与反向代理部署类似: 首先配置上游服务器(http{}段): ``` upstream backend { server www.ray.org:8090; //假定后端服务部署的端口为8090 } ``` server 中增加配置(server{}段): ``` location /api { proxy_pass http://backend/api; } ``` ## 五、日志 ![](https://img.kancloud.cn/88/2d/882d69ec2e5cf94f80898a3e69e2e21e_473x77.png) ## 六、include nginx的配置很灵活,支持include配置文件,如果一个复杂的业务中,我们的所有配置到nginx.conf. 这个文件就会比较乱, 也影响管理和阅读;所以可以把它们拆分出来,分成不同的配置文件; 例如:如果你想在/conf下放多个配置文件 ,都加载到nginx中,直接在nginx.conf文件内include: ~~~bash include /usr/local/nginx/conf/*.conf ~~~ 举例: ![](https://img.kancloud.cn/f6/f4/f6f4b68d9728a95d612be12bab46d310_1034x577.png) ## 七、location >[danger] 原则: > 1、`=`开头表示精确匹配; > 2、`^~` 开头表示uri以某个常规字符串开头,不是正则匹配; > 3、`~`开头表示区分大小写的正则匹配; > 4、`~*`开头表示不区分大小写的正则匹配; > 5、`/` 通用匹配, 如果没有其它匹配,任何请求都会匹配到; ``` location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] } location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] } location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] } location ~* /js/.*/\.js ``` ## 八、rewrite rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy\_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是; 1. 执行server块的rewrite指令 2. 执行location匹配 3. 执行选定的location中的rewrite指令 ## 九、全局变量 * `$args` : #这个变量等于请求行中的参数,同`$query_string` * `$content_length` : 请求头中的Content-length字段。 * `$content_type` : 请求头中的Content-Type字段。 * `$document_root` : 当前请求在root指令中指定的值。 * `$host` : 请求主机头字段,否则为服务器名称。 * `$http_user_agent` : 客户端agent信息 * `$http_cookie` : 客户端cookie信息 * `$limit_rate` : 这个变量可以限制连接速率。 * `$request_method` : 客户端请求的动作,通常为GET或POST。 * `$remote_addr` : 客户端的IP地址。 * `$remote_port` : 客户端的端口。 * `$remote_user` : 已经经过Auth Basic Module验证的用户名。 * `$request_filename` : 当前请求的文件路径,由root或alias指令与URI请求生成。 * `$scheme` : HTTP方法(如http,https)。 * `$server_protocol` : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 * `$server_addr` : 服务器地址,在完成一次系统调用后可以确定这个值。 * `$server_name` : 服务器名称。 * `$server_port` : 请求到达服务器的端口号。 * `$request_uri` : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 * `$uri` : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 * `$document_uri` : 与$uri相同;