nginx 的根目录 为:/home/undoner/nginx-www
nginx 访问地址 为:http://127.0.0.1
本文实现对nginx根目录文件访问的权限控制

(1)nginx指定密码文件格式为:“username:password”,但是password不能为明文,必须经过crypt加密,所以需要用工具产生密码字符串

以下有三种方法:

第一种.

在线直接生成加密字符串:http://tool.oschina.net/htpasswd

第二种

python脚本:“htpasswd.py”,也可以下载

  1. #!/usr/bin/python
  2. """Replacement for htpasswd"""
  3. # Original author: Eli Carter
  4.  
  5. import os
  6. import sys
  7. import random
  8. from optparse import OptionParser
  9.  
  10. # We need a crypt module, but Windows doesn't have one by default. Try to find
  11. # one, and tell the user if we can't.
  12. try:
  13. import crypt
  14. except ImportError:
  15. try:
  16. import fcrypt as crypt
  17. except ImportError:
  18. sys.stderr.write("Cannot find a crypt module. "
  19. "Possibly http://carey.geek.nz/code/python-fcrypt/\n")
  20. sys.exit(1)
  21.  
  22. def salt():
  23. """Returns a string of 2 randome letters"""
  24. letters = 'abcdefghijklmnopqrstuvwxyz' \
  25. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \
  26. '0123456789/.'
  27. return random.choice(letters) + random.choice(letters)
  28.  
  29. class HtpasswdFile:
  30. """A class for manipulating htpasswd files."""
  31.  
  32. def __init__(self, filename, create=False):
  33. self.entries = []
  34. self.filename = filename
  35. if not create:
  36. if os.path.exists(self.filename):
  37. self.load()
  38. else:
  39. raise Exception("%s does not exist" % self.filename)
  40.  
  41. def load(self):
  42. """Read the htpasswd file into memory."""
  43. lines = open(self.filename, 'r').readlines()
  44. self.entries = []
  45. for line in lines:
  46. username, pwhash = line.split(':')
  47. entry = [username, pwhash.rstrip()]
  48. self.entries.append(entry)
  49.  
  50. def save(self):
  51. """Write the htpasswd file to disk"""
  52. open(self.filename, 'w').writelines(["%s:%s\n" % (entry[0], entry[1])
  53. for entry in self.entries])
  54.  
  55. def update(self, username, password):
  56. """Replace the entry for the given user, or add it if new."""
  57. pwhash = crypt.crypt(password, salt())
  58. matching_entries = [entry for entry in self.entries
  59. if entry[0] == username]
  60. if matching_entries:
  61. matching_entries[0][1] = pwhash
  62. else:
  63. self.entries.append([username, pwhash])
  64.  
  65. def delete(self, username):
  66. """Remove the entry for the given user."""
  67. self.entries = [entry for entry in self.entries
  68. if entry[0] != username]
  69.  
  70. def main():
  71. """%prog [-c] -b filename username password
  72. Create or update an htpasswd file"""
  73. # For now, we only care about the use cases that affect tests/functional.py
  74. parser = OptionParser(usage=main.__doc__)
  75. parser.add_option('-b', action='store_true', dest='batch', default=False,
  76. help='Batch mode; password is passed on the command line IN THE CLEAR.'
  77. )
  78. parser.add_option('-c', action='store_true', dest='create', default=False,
  79. help='Create a new htpasswd file, overwriting any existing file.')
  80. parser.add_option('-D', action='store_true', dest='delete_user',
  81. default=False, help='Remove the given user from the password file.')
  82.  
  83. options, args = parser.parse_args()
  84.  
  85. def syntax_error(msg):
  86. """Utility function for displaying fatal error messages with usage
  87. help.
  88. """
  89. sys.stderr.write("Syntax error: " + msg)
  90. sys.stderr.write(parser.get_usage())
  91. sys.exit(1)
  92.  
  93. if not options.batch:
  94. syntax_error("Only batch mode is supported\n")
  95.  
  96. # Non-option arguments
  97. if len(args) < 2:
  98. syntax_error("Insufficient number of arguments.\n")
  99. filename, username = args[:2]
  100. if options.delete_user:
  101. if len(args) != 2:
  102. syntax_error("Incorrect number of arguments.\n")
  103. password = None
  104. else:
  105. if len(args) != 3:
  106. syntax_error("Incorrect number of arguments.\n")
  107. password = args[2]
  108.  
  109. passwdfile = HtpasswdFile(filename, create=options.create)
  110.  
  111. if options.delete_user:
  112. passwdfile.delete(username)
  113. else:
  114. passwdfile.update(username, password)
  115.  
  116. passwdfile.save()
  117.  
  118. if __name__ == '__main__':
  119. main()

第三种

perl脚本:“htpasswd2.pl”  ,内容如下:

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

(2)若是第一种方法,直接新建文本复制进去就行;若是第二种或第三种,下载或新建文件后,注意添加可执行权限,再执行脚本生成用户名密码。

第一种:

将网页上面的结果(“2eN4uuMHGaLQQ”即“test1”加密后的字符串)直接复制进 htpasswd 文件中

htpasswd内容:test1:2eN4uuMHGaLQQ

第二种:

  1. chmod 777 htpasswd.py
  2. ./htpasswd.py -c -b htpasswd username password

比如:./htpasswd.py -c -b htpasswd undoner undoner    ,得到文件:htpasswd ,内容如下(“dFYOP1Zvmqyfo”即“undoner”加密后的字符串):

htpasswd内容:undoner:dFYOP1Zvmqyfo

第三种:

  1. chmod 777 htpasswd2.pl
  2. ./htpasswd2.pl password

比如:./htpasswd2.pl test        ,得到密码字符串:N1tQbOFcM5fpg

可将 ”N1tQbOFcM5fpg“ 复制进 /etc/nginx/htpasswd 文件中,用户名是明文的,所以设什么都行,格式如下:

htpasswd内容:test:N1tQbOFcM5fpg

(3)最后将该密码文件htpasswd复制到nginx的配置文件目录(也可放其他位置,注意改路径+改权限),最后nginx里面添加配置即可。

  1. chmod 777 htpasswd

在sites-available/default添加下面两行内容:

auth_basic "Password";

auth_basic_user_file /etc/nginx/htpasswd;

  1. location / {
  2. # First attempt to serve request as file, then
  3. # as directory, then fall back to displaying a 404.
  4. auth_basic "Password";
  5. auth_basic_user_file /etc/nginx/htpasswd;
  6. charset utf-8;
  7. root /home/undoner/nginx-www;
  8. index index.html index.htm;
  9. autoindex on;
  10. # Uncomment to enable naxsi on this location
  11. # include /etc/nginx/naxsi.rules
  12. }

(4)重启nginx

  1. sudo /etc/init.d/nginx restart

Nginx创建密码保护目录的更多相关文章

  1. nginx中给目录增加密码保护实现程序

    一款nginx中给目录增加密码保护实现程序,可以有效的保护一些目录不被访问,有需要的朋友可参考一下. 了防止一些可能出现存在漏洞的后台脚本暴露,使用验证的方式保护这些文件所在的目录 使用apache的 ...

  2. 把 Nginx 创建为 Windows 的一个服务

    译序:Nginx 不是为 Windows 而写.Nginx 是用在软件的工作环境中的.但软件开发环境一般都是 Windows,有时调试的需要也要装 Nginx,但 Nginx 并没给 Windows ...

  3. MFC 创建多层目录

    创建多层目录 BOOL CTestToolCtr::CreateFolder(CString strNewFolder) { /************************************ ...

  4. php使用递归创建多级目录

    <?php header('Content-type:text/html;charset=utf8'); echo "Loading time:".date('Y-m-d H ...

  5. PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)

    在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其实不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段 ...

  6. PHP 检查并创建多级目录

    <?php //检查并创建多级目录    function checkDir($path){        $pathArray = explode('/',$path);        $no ...

  7. 如何让nginx显示文件夹目录

    1. 如何让nginx显示文件夹目录 vi /etc/nginx/conf.d/default.conf 添加如下内容: location / {           root /data/www/f ...

  8. 修改nginx的访问目录以及遇到的403错误修改总结

    对于这个问题困扰了我好几天,前篇文章介绍了图片服务器的使用,但是两个服务器如何进行通话访问呢,即如何通过nginx来访问ftp服务器上的资源文件呢,这里面需要修改nginx的配置文件(vi /usr/ ...

  9. VS 创建虚拟目录失败,映射到其他文件夹!

    今天,改一哥们项目!立马,问了一下原因.支支吾吾的气死LZ! 算了,就不信自己琢磨不出来!哼 找了半天,坑爹的是在Web.csproj文件中! 用txt打开,发现这个东东! <UseIIS> ...

随机推荐

  1. Windows、Unix、Linux是什么类型的操作系统?

    Windows:具有图形用户界面的视窗操作系统. Unix:多用户分时操作系统. Linux:类似Unix操作系统,用于个人计算机.

  2. Python中模块之re的功能介绍

    re模块的功能介绍 1. 方法 match 从开头开始查找 方法:re.match(pattern,string,flags=0) 返回值:<class '_sre.SRE_Match'> ...

  3. C语言作业程序设计第一次作业

    1.求圆面积和面积 (1)题目: 输入圆的半径,计算圆的周长和面积 (2)流程图: (3)测试数据及运行结果 测试数据:r=4 运行结果: (4)实验分析 没有遇到问题 2.判断闰年问题 (1)题目: ...

  4. EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?

    前言 很长一段时间没有写博客了,今天补上一篇吧,偶尔发现不太愿意写博客了,太耗费时间,不过还是在坚持当中,毕竟或许写出来的东西能帮到一些童鞋吧,接下来我们直奔主题.无论是在在EF 6.x还是EF Co ...

  5. Java的数组排序

    对数组进行排序 使用到的排序算法有: 1 选择排序   2 冒泡排序   3 插入排序    4 JavaAPI提高排序算法 选择排序的原理: 1 将数组中每个元素与第一个元素比较,如果这个元素小于第 ...

  6. HTML入门知识

    B/S:浏览器-服务器 C/S:客户端-服务器 更新麻烦 管理麻烦 PHP:基于BS结构进行项目开发的语言 ====================HTML:超文本标记语言 -- 控制网面内容CSS: ...

  7. Linux下查看alert日志文件的两种方法

    --linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...

  8. python学习之路前端-HTML

    HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以 ...

  9. Kafka生产者-向Kafka中写入数据

    (1)生产者概览 (1)不同的应用场景对消息有不同的需求,即是否允许消息丢失.重复.延迟以及吞吐量的要求.不同场景对Kafka生产者的API使用和配置会有直接的影响. 例子1:信用卡事务处理系统,不允 ...

  10. MongoDB 关系

    MongoDB 的关系表示多个文档之间在逻辑上的相互联系. 文档间可以通过嵌入和引用来建立联系. MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多) N: 1 (多对1) N: ...