学习如何部署配置nginx

一、 Nginx是做什么的?

Nginx 是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP/UDP代理服务器。

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

在项目使用中,使用最多的三个核心功能是静态服务器、反向代理和负载均衡。

二、 Nginx的常用命令

  • 启动

    • 直接使用nginx启动

    • 使用systemctl start nginx.service启动

  • 查看

    • 使用ps aux | grep nginx查询

    • 使用systemctl status nginx.service查看

查看nginx的安装目录

  • 停止

    • 立即停止服务, nginx -s stop

    • 从容停止服务 nginx -s quit

    • 杀死进程 killall nginx

  • 重启

    • systemctl restart nginx.service
  • 更新

    • nginx -s reload
  • 查看端口占用

    • netstat -tlnp

使用帮助:nginx -h

三、 Nginx基本配置文件详解

1. 查看nginx的安装目录

  • rpm -ql nginx

    rpm是linux的rpm包管理工具

  • -q 代表询问模式

  • -l 代表返回列表

2. nginx.conf配置详解

进入/etc/nginx.使用vim打开nginx.conf

1
2
cd /etc/nginx
vim nginx.conf

3. nginx.conf的内容:

在项目使用中,使用最多的三个核心功能是静态服务器、反向代理和负载均衡。

这三个不同的功能的使用,都跟Nginx的配置密切相关,Nginx服务器的配置信息主要集中在”nginx.conf”这个配置文件中,并且所有的可配置选项大致分为以下几个部分.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 #运行用户,默认即是nginx,可以不进行设置
user nginx;
#Nginx进程,一般设置为和CPU核数一样
worker_processes 1;
#错误日志存放目录
error_log /var/log/nginx/error.log warn;
#进程pid存放位置
pid /var/run/nginx.pid;

events {
worker_connections 1024; # 单个后台进程的最大并发数
}

http {
include /etc/nginx/mime.types; #文件扩展名与类型映射表
default_type application/octet-stream; #默认文件类型
#设置日志模式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main; #nginx访问日志存放位置

sendfile on; #开启高效传输模式
#tcp_nopush on; #减少网络报文段的数量

keepalive_timeout 65; #保持连接的时间,也叫超时时间

#gzip on; #开启gzip压缩

include /etc/nginx/conf.d/*.conf; #包含的子配置项位置和文件

4. 配置文件组成

  1. 全局块(main模块)

从配置文件到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户、允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等.

  • user 用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
  • worker_processes 指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
  • error_log 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
  • pid 用来指定进程id的存储文件的位置
  • worker_rlimit_nofile 用于指定一个进程可以打开最多文件数量的描述
  1. events块

events块涉及的指令主要影响Nginx服务器与用户的网络连接

  • worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
  • multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
  • use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
  1. http {}配置

Nginx服务器培配置中最频繁的部分、代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都在这里

http全局块:

    http全局快配置的指令包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求书上限等
1
2
3
4
5
6
7
8
9
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#access_log logs/access.log main; #日志格式设定
sendfile on; #支持文件下载
#tcp_nopush on; #此选项允许或禁止使用socket的TCP
#keepalive_timeout 0; #连接保持超时时间,单位是秒
keepalive_timeout 65
#gzip on; ##gzip模块设置,设置是否开启gzip压缩输出

server块:

    每个server块也分为全局server块,以及可以同时包含多个location块

    (1)全局server{}块

        最常见的配置是本虚拟主机的监听配置和本虚拟机的名称或IP配置

    (2)location{} 块

        一个server可以配置多个location块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80; #监听地址及端口
server_name www.yxp.com; #站点域名,可以有多个,用空格隔开
#charset utf-8; #网页的默认字符集
#access_log logs/host.access.log main;
location / { #根目录配置
root html; #网站根目录的位置/usr/local/nginx/html
index index.html index.htm; #默认首页文件名
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; #内部错误的反馈页面
location = /50x.html { #错误页面配置
root html;
}

这块的主要作用是基于Nginx服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机名称之外的字符串进行(例如 前面的uri-string)进匹配,对特定的请求进行处理,地址指向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四、 使用域名配置虚拟主机

  • 配置基于不同端口的监听服务
1
2
3
4
5
6
server{
listen 8010;
server_name _;
root /wangzai/images;
index a.jpg;
}
  • 基于域名的监听服务配置
    1
    2
    3
    4
    5
    6
    7
    8
    server{
    listen 80;
    server_name nginx2.jspang.com;
    location / {
    root /usr/share/nginx/html/html8001;
    index index.html index.htm;
    }
    }

练习Docker安装并配置nginx

1. 安装Nginx镜像

在阿里云服务器执行以下docker命令:

1
docker pull nginx

检查镜像是否安装成功

1
docker images

检查是否有Nginx镜像

可以看到已经有latest版本的nginx镜像了

2. 创建Nginx配置文件

启动前需要先创建Nginx外部挂载的配置文件( /home/nginx/conf/nginx.conf)
之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件
当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果 。

1
2
3
4
# 创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html

容器中的nginx.conf文件和conf.d文件夹复制到宿主机

1
2
3
4
5
6
7
8
9
# 生成容器
docker run --name nginx -p 8080:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/

4. 创建Nginx容器并运行

Docker 创建Nginx容器
1
2
3
4
5
6
7
8
9
10
# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx

# 删除正在运行的nginx容器
docker rm -f nginx
1
2
3
4
5
6
7
8
docker run \
-p 8080:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:latest
命令 描述
–name nginx 启动容器的名字
-d 后台运行
-p 9002:80 将容器的 9002(后面那个) 端口映射到主机的 80(前面那个) 端口
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 挂载nginx.conf配置文件
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d 挂载nginx配置文件
-v /home/nginx/log:/var/log/nginx 挂载nginx日志文件
-v /home/nginx/html:/usr/share/nginx/html 挂载nginx内容
nginx:latest 本地运行的版本
\ shell 命令换行

5. 查看效果

执行命令没有报错,在 http://120.79.182.135:8080/ 查看效果

在docker安装Nginx并运行

查看Nginx运行效果

6、修改内容进行展示

修改/home/nginx/html的index.html文件

修改index.html

重启容器

1
docker restart nginx

修改index.html后的效果

可以看到有中文乱码问题

再次进入html文件的 head 标签中
添加以下代码:

1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

重启容器

1
docker restart nginx

修改index.html后的效果2