Nginx

暂时回不去上课了,无聊的时候把最近遇到的问题,还有一些笔记给总结一下,希望对大家有点用。

本文主要讲的是nginx部署静态网页和动态网页等多种情况。

如果不了解nginx 的可以提前准备了解一下关于nginx的资料,已经怎么工作的

环境准备

如果是Ubuntu来当做服务器的话,可以执行以下命令来安装Nginx(请确保80端口没有被占用):

1
sudo apt-get install update
1
sudo apt-get install nginx

ps: 如果80端口被占用会一直报错的

Nginx常用命令:

1
2
3
4
5
6
7
8
# 重启Nginx服务器
sudo systemctl restart nginx
# 重启Nginx服务器
sudo systemctl start nginx
# 关闭Nginx服务器
sudo systemctl stop nginx
# 查看Nginx服务状态
sudo systemctl status nginx

也可以直接调用/etc/init.d/nginx命令操作:

1
2
3
4
5
6
7
8
9
10
11
12
# 查看help文档
sudo /etc/init.d/nginx --help
# 重启Nginx服务器
sudo /etc/init.d/nginx restart
# 重启Nginx服务器
sudo /etc/init.d/nginx start
# 关闭Nginx服务器
sudo /etc/init.d/nginx stop
# 查看Nginx服务状态
sudo /etc/init.d/nginx status
# 重新加载Nginx
sudo /etc/init.d/nginx reload

文件目录

文件目录:/etc/nginx

常用的目录以及文件,一般的修改方法有两种:

  1. 添加自己的配置文件到conf.d 目录
  2. 修改默认的配置文件nginx.conf
1
2
3
.
├── conf.d -- 配置文件目录(存放自己的配置文件)
├── nginx.conf -- Nginx的默认配置文件

Nginx 部署静态文件

Nginx部署静态文件包含三步:

  1. 首先我们把打包过的HTML文件上传到服务器
  2. 得到HTML文件的绝对路径(pwd可以完成)
  3. 修改Nginx配置文件

具体怎么上传文件到服务器可以Google或者Baidu去找资料,在这里就不详细说了。

修改Nginx配置:

ps:我们一般只需要修改http里面的配置

假设在服务器里面我们的文件是: /home/ubuntu/build, 文件里面包含了index.html

第一种方法:直接修改配置文件

然后我们需要配置Nginx (/etc/nginx/nginx.conf),添加以下代码到文件里http的配置里面(两种法法任意一种都可以):

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
# 第一种方法
server {
listen 80; # 监听的端口
server_name xxx.com; # 监听的url
root /home/ubuntu/build; # 文件目录
charset utf-8; # 字符配置
location / {
try_files $uri @fallback;
}
# 路由位置
location @fallback {
rewrite .* /index.html break;
}
}

# 第二种方法
server {
listen 80; # 监听的端口
server_name xxx.com; # 监听的url
root /home/ubuntu/build; # 文件目录
charset utf-8; # 字符配置
# 路由位置
location / {
index index.html index.htm;
}
}

/etc/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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;
# multi_accept on;
}

http {
##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

4include /etc/nginx/conf.d/*.conf;
4include /etc/nginx/sites-enabled/*;

# # 第一种方法
# server {
# listen 80; # 监听的端口
# server_name xxx.com; # 监听的url
# root /home/ubuntu/build; # 文件目录
# charset utf-8; # 字符配置
# location / {
# try_files $uri @fallback;
# }
# # 路由位置
# location @fallback {
# rewrite .* /index.html break;
# }
# }

# 第二种方法
server {
listen 80; # 监听的端口
server_name xxx.com; # 监听的url
root /home/ubuntu/build; # 文件目录
charset utf-8; # 字符配置
# 路由位置
location / {
index index.html index.htm;
}
}
}

第二种方法:添加新的配置文件

  1. /etc/nginx/conf.d的文件夹下面创建config.conf
  2. 把配置代码写入到config.conf
  3. 加载到默认的配置文件中

把上面提到的那两种方法写入/etc/nginx/conf.d/config.conf的配置文件中,然后修改/etc/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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;
# multi_accept on;
}

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

# TODO 包含配置文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

ps:在最后会把具体的文件上传的

Nginx + gunicorn + supervisor + flask

大部分时候我们写的不仅仅是静态HTML文件,比如说带后台的web(flask,spring)等等,这时候我们需要Nginx来配置相对应的服务。这里我们用flask给大家演示一下怎么配置。

首先需要安装gunicorn,supervisor

1
2
pip3 install gunicorn
sudo apt install supervisor

假设我们当前文件夹下面有run.py的文件,代码如下:

1
2
3
4
5
6
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
return "hello world"

使用gunicorn来启动flask服务:

1
2
3
4
5
# run 是指run.py
# app是指启动器
# workers 用来定义工作线程的数量,一般 worker 的数量为 (2×$num_cores)+1
# bind 是绑定主机地址和端口
gunicorn --workers=4 --bind=127.0.0.1:8000 run:app

如果正常启动我们在浏览器访问127.0.0.1:8000就能看到hello world

使用supervisor管理进程:

Supervisor 是一个 客户端/服务器系统,允许其用户在类 UNIX操作系统上控制进程。当进程被意外杀死,Supervisor 可以主动将其拉起。

使用如下命令构建配置文件:

1
echo_supervisord_conf > /etc/supervisord.conf

编辑配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
[program:gunicorn]
user = root ; 以root 用户启动
directory = /home/ubuntu ; flask 文件所在目录
command = /usr/local/bin/gunicorn --workers=4 --bind=0.0.0.0:8000 run:app ; 程序启动命令
startsecs = 5 ; 启动 5秒后没有异常退出,视作正常启动
autostart = true ; 在 supervisord 启动时自动启动
autorestart = true ; 程序异常退出后重启
redirect_stderr = true ; stderr 也重定向至 stdout
stdout_logfile = /home/ubuntu/gunicorn.log ; stdout 日志文件,需要手动创建日志存放目录
[supervisord]

ps:关于如何找到gunicorn的路径:

1
2
➜  ~ > which gunicorn
/usr/local/bin/gunicorn

输入下面命令来启动服务:

1
supervisord -c /etc/supervisord.conf

supervisor常用命令

1
2
3
4
5
6
7
8
# 查看supervisor状态
supervisorctl status
# 停止supervisor
supervisorctl stop gunicorn
# 启动supervisor
supervisorctl start gunicorn
# 重启supervisor
supervisorctl restart gunicorn

ps:更多命令可查看官方文档

使用Nginx反向代理flask服务

修改配置的server:

1
2
3
4
5
6
7
server {
listen 80;
server_name xxx.com;
location / {
proxy_pass http://127.0.0.1:8000/;
}
}

ps:更多详情请看官方文档

Demo文件下载

----- End Thanks for reading-----