工作中经常需要在服务器上来做一下实验,亲自动手看看效果是否与理论描述的相同。用docker可以很方便的配置所需要的环境,以下内容记录了如何用docker配置一个nginx服务器

下载nginx

从默认的中央仓库下载nginx

docker pull nginx

启动nginx images并进入后台

docker run -it nginx /bin/bash

通过查看linux发行版知晓用哪个包管理工具

cat /proc/version

Linux version 4.14.92-boot2docker (root@2c85d808f0f3) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)) #1 SMP Wed Jan 9 22:03:23 UTC 2019

可以看到这里默认用的是Debian,因此包管理工具使用apt-get

安装常用工具vim curl等

apt-get install vim

如果安装不了,命令提示如下

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim

这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

等更新完毕以后重新执行apt-get install vim命令即可。

设置ll别名

vi ~/.bashrc

添加下面这句

alias ll='ls $LS_OPTIONS -l'

docker端口映射方便本机访问

docker run -p 8080:80 -it nginx /bin/bash

在宿主机中访问localhost:8080即可看到nginx欢迎页面

注意

在window中宿主机是192.168.99.100,所以访问地址是http://192.168.99.100:8080

原因:docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows。找到这个Linux的ip地址,一般情况下这个地址是192.168.99.100(docker-machine ip default 命令查找)

nginx相关配置

nginx的压缩输出配置

# 开启gzip
gzip on;
# 启用gzip压缩的最小文件
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
# gzip 压缩级别
gzip_comp_level 2;
# 进行压缩的文件类型。
gzip_types text/plain application/x-javascript application/css text/css application/xml text/javascript application/x-httpd-php
gzip_vary on;

Nginx配置静态资源跨域访问

location / {
add_header Access-Control-Allow-Origin http://php.jesse.com; //只允许的域名
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; //只允许的方法
root /var/www/php;
index index.html index.htm;
}

Nginx配置静态资源防盗链

location ~ .*\.(jpg|gif|png)$ {
valid_referers none blocked php.jesse.com;
if ($invalid_referer) {
return 403;
}
}

Nginx 静态资源缓存设置

location ~ .*\.(php|htm|html)$ {
add_header Cache-Control no-cache;
add_header Pragma no-cache;
}
location ~ .*\.(css|js|swf)$ {
add_header Cache-Control max-age=600;
}
location ~ .*\.(jpg|gif|png)$ {
expires 3d;
}

Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。

http协议头Cache-Control

值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age

各个消息中的指令含义如下:

  • Public 指示响应可被任何缓存区缓存。
  • Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
  • no-cache 告诉浏览器、缓存服务器,不管本地副本是否过期,使用资源副本前,一定要到源服务器进行副本有效性校验。
  • no-store 请求和响应消息都不使用缓存。
  • max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
  • must-revalidate告诉浏览器、缓存服务器,本地副本过期前,可以使用本地副本;本地副本一旦过期,必须去源服务器进行有效性校验

Nginx 配置SSL及Http跳转到Https

下面是简化的创建自签名证书流程,需要安装openssl,使用以下步骤:

  • 创建Key;
  • 创建签名请求;
  • 将Key的口令移除;
  • 用Key签名证书。

生成私钥

使用openssl工具生成一个RSA私钥

openssl genrsa -des3 -out server.key 1024

参数说明:生成rsa私钥,des3算法,1024位强度,server.key是秘钥文件名。

生成CSR(证书签名请求)

openssl req -new -key server.key -out server.csr

生成证书签署请求文件之后,就可以进行证书签名了,而这个时候可以有两种选择。

第一种,就是你把这个CSR文件,发送给权威的CA机构,由他们进行验证和正式签名,这种方式签名后的证书就是得到权威机构进行验证的,具备有效性,效果就是所有客户端的浏览器都能认可你的证书,但是这种方式是收费的。

第二种,自建CA,自签证书,意思就是自己给自己签署证明,很显然,这种方式的签署证书,就不能得到权威验证,无法具备公认的有效性,所以如果客户端访问,会显示证书无效,或者不安全之类的,这种方式是免费的,一般内部测试或者使用的话,用这种方式就可以了。

删除私钥中的密码

在第1步创建私钥的过程中,由于必须要指定一个密码。而这个密码会带来一个副作用,那就是在每次nginx启动时,都会要求输入密码,这显然非常不方便。要删除私钥中的密码,操作如下:

openssl rsa -in server.key.org -out server.key

生成自签名证书

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

原80端口做301转跳
server {
listen 80;
server_name php.jesse.com;
return 301 https://php.jesse.com$request_uri; #跳转到Https
}

由于用户习惯,通常准备访问某个网站时,在浏览器中只会输入一个域名,而不会在域名前面加上 http:// 或者 https://,而是由浏览器自动填充,当前所有浏览器默认填充的都是http://。一般情况网站管理员会采用了 301/302 跳转的方式由 HTTP 跳转到 HTTPS,但是这个过程总使用到 HTTP 因此容易发生劫持,受到第三方的攻击。这个时候就需要用到 HSTS(HTTP 严格安全传输)。

开启ssl功能
server {
listen 443;
server_name php.jesse.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; # hsts
root /var/www/php;
index index.html index.htm; ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
}

制作mynginx镜像

以上我们在nginx镜像生成的容器中做了很多操作,也安装了以下必要的插件。下次使用的时候我们希望是在原来的基础上操作,我们可以直接使用之前的容器,我们也可以将之前的容器制作成镜像。

docker commit -a "username" -m "this is mynginx" <container id> mynginx

参考文档

  1. Nginx 容器教程
  2. 给Nginx配置一个自签名的SSL证书

Docker中Nginx服务器相关配置的更多相关文章

  1. Linux中Nginx安装与配置详解

    转载自:http://www.linuxidc.com/Linux/2016-08/134110.htm Linux中Nginx安装与配置详解(CentOS-6.5:nginx-1.5.0). 1 N ...

  2. 通过浏览器查看nginx服务器状态配置方法

    通过浏览器查看nginx服务器状态配置方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了通过浏览器查看nginx服务器状态配置方法,本文讲解开启nginx-status的配 ...

  3. Analysis Services 中的服务器属性配置

    Analysis Services 中的服务器属性配置: https://docs.microsoft.com/zh-cn/sql/analysis-services/server-propertie ...

  4. Nginx 服务器伪静态配置不当造成 Access denied

    Nginx 服务器伪静态配置不当造成 Access denied 有群有反馈将 FastAdmin 布署到阿里云后无法打开后台. 出现如下提示,首页是可以打开,点登录链接后出现的.(下是群友的截图) ...

  5. Linux中Nginx服务器的部署和配置

    目录 Nginx安装方式: yum源安装 目录结构: 源码包安装 目录结构: Nginx中支持PHP Nginx中配置php对mysql数据库的支持 Nginx配置反向代理服务器 正常代理 根据不同端 ...

  6. Nginx中并发性能相关配置参数说明

    worker_processes:开启worker进程的数目,通常可设置为CPU核心的倍数.在不清楚的情况下,可设置成一倍于CPU核心数或auto(Nginx将自动发现CPU核心数). worker_ ...

  7. nginx 服务器常见配置以及负载均衡

    # 配置启动用户,用户权限不够会出现访问 403 的情况 user root; # 启动多少个工作进程 worker_processes 1; # 错误日志文件进程文件的保存地址 error_log ...

  8. Docker运行Nginx服务器

    一.获取Docker容器的Nginx镜像 二.创建Docker容器宿主机挂载目录 # 创建挂载目录,-v 显示创建的目录名 [root@idclooknet ~]# mkdir -vp /opt/do ...

  9. 2.5 Nginx服务器基础配置实例

    pay平台nginx配置文件详解 ###全局块###   user www www; #指定运行worker process 的用户和用户组 worker_processes 4; #指定Nginx开 ...

随机推荐

  1. 转。http,状态码详解

    转自konglingbinHTTP状态码详解:https://www.cnblogs.com/klb561/p/9205867.html HTTP状态码(HTTP Status Code)是用以表示网 ...

  2. App自动化测试-1.App自动化介绍和环境搭建

    App自动化测试-1.App自动化介绍和环境搭建 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-b ...

  3. DVWA学习之SQL注入

    DVWA学习之SQL注入 环境工具 dvwa 1.9 phpstudy firefox burpsuite 实验步骤 一.设置安全级别为LOW 1. 登录DVWA,并将安全级别设置为LOW 2. 进入 ...

  4. ansible roles 介绍和使用

    目录 roles roles 介绍 创建role的步骤 role内个目录中可用的文件 案例 roles roles 介绍 ansible 自1.2版本引入的新特性,用于层次性.结构化地组织playbo ...

  5. python_排序

    快速排序 基本思想是:从一个数组中随机选出一个数N,通过一趟排序将数组分割成三个部分,1.小于N的区域 2.等于N的区域 3.大于N的区域,然后再按照此方法对小于区的和大于区分别递归进行,从而达到整个 ...

  6. 文件上传之靶场upload-labs (1-10)

    第一关 sj 绕过 源码如下: lasIndexOf是返回函数最后一次出现的地方(从右到左) substring是用来截取函数的 indexOf是返回 表示从.出现的地方开始截取并判断是否在允许的字符 ...

  7. 了解 MongoDB 看这一篇就够了【华为云分享】

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  8. Internet History,Technology,and Security - History Through Supercomputing(Week2)

    时间飞逝,一周又过去了,这周我们来到了Internet History, Technology and Security (Week 2)的学习,从标题就可以看出,这周主要是介绍“互联网”雏形的诞生. ...

  9. 《手把手教你》系列进阶篇之2-python+ selenium自动化测试 - python基础扫盲(详细教程)

    1. 简介 这篇文章主要是分享讲解一下,如何封装自己用到的方法和类.以便方便自己和别人的调用,这样就可以避免重复地再造轮子. 封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承 ...

  10. wait notify notifyAll await signal signalAll 的理解及示例

    从常见的一道面试题开始,题目的描述是这样子的: 有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 网上大都教了你怎么去实现,其实我也写过一篇 https://bl ...