经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Nginx » 查看文章
Nginx的一些常用配置与技巧总结
来源:jb51  时间:2019/5/29 9:50:32  对本文有异议

前言

文章列举了几个Nginx常见的,实用的,有趣的配置,希望看过之后能说一句:学到了!

一个站点配置多个域名

  1. server {
  2. listen 80;
  3. server_name ops-coffee.cn b.ops-coffee.cn;
  4. }

server_name 后跟多个域名即可,多个域名之间用空格分隔

一个服务配置多个站点

  1. server {
  2. listen 80;
  3. server_name a.ops-coffee.cn;
  4.  
  5. location / {
  6. root /home/project/pa;
  7. index index.html;
  8. }
  9. }
  10.  
  11. server {
  12. listen 80;
  13. server_name ops-coffee.cn b.ops-coffee.cn;
  14.  
  15. location / {
  16. root /home/project/pb;
  17. index index.html;
  18. }
  19. }
  20.  
  21. server {
  22. listen 80;
  23. server_name c.ops-coffee.cn;
  24.  
  25. location / {
  26. root /home/project/pc;
  27. index index.html;
  28. }
  29. }

基于Nginx虚拟主机配置实现,Nginx有三种类型的虚拟主机

基于IP的虚拟主机: 需要你的服务器上有多个地址,每个站点对应不同的地址,这种方式使用的比较少

基于端口的虚拟主机: 每个站点对应不同的端口,访问的时候使用ip:port的方式访问,可以修改listen的端口来使用

基于域名的虚拟主机: 使用最广的方式,上边例子中就是用了基于域名的虚拟主机,前提条件是你有多个域名分别对应每个站点,server_name填写不同的域名即可

nginx添加账号密码验证

  1. server {
  2. location / {
  3. auth_basic "please input user&passwd";
  4. auth_basic_user_file key/auth.key;
  5. }
  6. }

有很多服务通过nginx访问,但本身没有提供账号认证的功能,就可以通过nginx提供的authbase账号密码认证来实现,可以用以下脚本来生成账号的密码

  1. # cat pwd.pl
  2. #!/usr/bin/perl
  3. use strict;
  4.  
  5. my $pw=$ARGV[0] ;
  6. print crypt($pw,$pw)."\n";

使用方法:

  1. # perl pwd.pl ops-coffee.cn
  2. opf8BImqCAXww
  3. # echo "admin:opf8BImqCAXww" > key/auth.key

nginx开启列目录

当你想让nginx作为文件下载服务器存在时,需要开启nginx列目录

  1. server {
  2. location download {
  3. autoindex on;
  4.  
  5. autoindex_exact_size off;
  6. autoindex_localtime on;
  7. }
  8. }

autoindex_exact_size: 为on(默认)时显示文件的确切大小,单位是byte;改为off显示文件大概大小,单位KB或MB或GB

autoindex_localtime: 为off(默认)时显示的文件时间为GMT时间;改为on后,显示的文件时间为服务器时间

默认当访问列出的txt等文件时会在浏览器上显示文件的内容,如果你想让浏览器直接下载,加上下边的配置

  1. if ($request_filename ~* ^.*?\.(txt|pdf|jpg|png)$) {
  2. add_header Content-Disposition 'attachment';
  3. }

配置默认站点

  1. server {
  2. listen 80 default;
  3. }

当一个nginx服务上创建了多个虚拟主机时默认会从上到下查找,如果匹配不到虚拟主机则会返回第一个虚拟主机的内容,如果你想指定一个默认站点时,可以将这个站点的虚拟主机放在配置文件中第一个虚拟主机的位置,或者在这个站点的虚拟主机上配置listen default

不允许通过IP访问

  1. server {
  2. listen 80 default;
  3. server_name _;
  4.  
  5. return 404;
  6. }

可能有一些未备案的域名或者你不希望的域名将服务器地址指向了你的服务器,这时候就会对你的站点造成一定的影响,需要禁止IP或未配置的域名访问,我们利用上边所说的default规则,将默认流量都转到404去

上边这个方法比较粗暴,当然你也可以配置下所有未配置的地址访问时直接301重定向到你的网站去,也能为你的网站带来一定的流量

  1. server {
  2. rewrite ^/(.*)$ https://ops-coffee.cn/$1 permanent;
  3. }

直接返回验证文件

  1. location = /XDFyle6tNA.txt {
  2. default_type text/plain;
  3. return 200 'd6296a84657eb275c05c31b10924f6ea';
  4. }

很多时候微信等程序都需要我们放一个txt的文件到项目里以验证项目归属,我们可以直接通过上边这种方式修改nginx即可,无需真正的把文件给放到服务器上

nginx配置upstream反向代理

  1. http {
  2. ...
  3. upstream tomcats {
  4. server 192.168.106.176 weight=1;
  5. server 192.168.106.177 weight=1;
  6. }
  7.  
  8. server {
  9. location /ops-coffee/ {
  10. proxy_pass http://tomcats;
  11.  
  12. proxy_set_header Host $host;
  13. proxy_set_header X-Real-IP $remote_addr;
  14. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  15. proxy_set_header X-Forwarded-Proto $scheme;
  16. }
  17. }
  18.  
  19. }

稍不注意可能会落入一个proxy_pass加杠不加杠的陷阱,这里详细说下proxy_pass http://tomcats与proxy_pass http://tomcats/的区别:

虽然只是一个/的区别但结果确千差万别。分为以下两种情况:

1.  目标地址中不带uri(proxy_pass http://tomcats)。此时新的目标url中,匹配的uri部分不做修改,原来是什么就是什么。

  1. location /ops-coffee/ {
  2. proxy_pass http://192.168.106.135:8181;
  3. }
  4.  
  5. http://domain/ops-coffee/ --> http://192.168.106.135:8181/ops-coffee/
  6. http://domain/ops-coffee/action/abc --> http://192.168.106.135:8181/ops-coffee/action/abc

2.  目标地址中带uri(proxy_pass http://tomcats/,/也是uri),此时新的目标url中,匹配的uri部分将会被修改为该参数中的uri。

  1. location /ops-coffee/ {
  2. proxy_pass http://192.168.106.135:8181/;
  3. }
  4.  
  5. http://domain/ops-coffee/ --> http://192.168.106.135:8181
  6. http://domain/ops-coffee/action/abc --> http://192.168.106.135:8181/action/abc

nginx upstream开启keepalive

  1. upstream tomcat {
  2. server ops-coffee.cn:8080;
  3. keepalive 1024;
  4. }
  5.  
  6. server {
  7. location / {
  8. proxy_http_version 1.1;
  9. proxy_set_header Connection "";
  10.  
  11. proxy_pass http://tomcat;
  12. }
  13. }

nginx在项目中大多数情况下会作为反向代理使用,例如nginx后接tomcat,nginx后接php等,这时我们开启nginx和后端服务之间的keepalive能够减少频繁创建TCP连接造成的资源消耗,配置如上

keepalive: 指定每个nginxworker可以保持的最大连接数量为1024,默认不设置,即nginx作为client时keepalive未生效

proxy_http_version 1.1: 开启keepalive要求HTTP协议版本为HTTP 1.1

proxy_set_header Connection "": 为了兼容老的协议以及防止http头中有Connection close导致的keepalive失效,这里需要及时清掉HTTP头部的Connection

404自动跳转到首页

  1. server {
  2. location / {
  3. error_page 404 = @ops-coffee;
  4. }
  5.  
  6. location @ops-coffee {
  7. rewrite .* / permanent;
  8. }
  9. }

网站出现404页面不是特别友好,我们可以通过上边的配置在出现404之后给自动跳转到首页去

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号