Nginx常用配置
本篇整理一下Nginx常用的配置,并使用测试案例说明配置文件用法。
注意事项
- 文中①②…对应问题出现的位置
- nginx修改或添加配置文件需要使用
/usr/local/nginx/sbin/nginx -s reload
命令重新加载配置文件才能生效 - 修改主配置文件运行用户需要重启nginx,停止命令
/usr/local/nginx/sbin/nginx -s stop
,启动命令/usr/local/nginx/sbin/nginx -s
- 本篇除nginx配置文件(nginx.conf、server/*.conf)以外,其他均为测试需要
Nginx主配置
主配置文件中只是加入一些通用配置,详细设置区分管理至单独文件
1 | # 指定运行用户 |
前端
站点访问
为方便测试,需要完成以下几点
-
在hosts中添加
本机ip www.test.com
(将www.test.com
解析到本地) -
在
/root/www/www.test.com
文件夹下添加index.html
文件 -
index.html
文件内容<html><head><meta charset="utf-8"></head><body><h2>这里是www.test.com</h2></body></html>
-
在server文件夹下添加
www.test.com.conf
(文件名可任意设置)配置文件,内容如下1
2
3
4
5
6
7
8
9
10
11
12# 虚拟主机
server {
listen 80;
server_name www.test.com; # 浏览器访问域名
charset utf-8; # 指定字符集
root /root/www/www.test.com; # 访问根目录
# 路由
location / {
index index.html; # 入口文件
try_files $uri $uri/ /index.html; / 默认访问文件夹下的index.html , 例如访问/user 会自动尝试访问/user/index.html
}
} -
访问
www.test.com
测试是否可以访问页面
静态资源缓存
-
在hosts中添加
本机ip cache.test.com
(将cache.test.com
解析到本地) -
在
/root/www/cache.test.com
文件夹下添加index.html
文件,内容如下1
2
3
4
5
6
7
8
9<html>
<head>
<meta charset="utf-8">
<script src="index.js"></script>
</head>
<body>
<h2>这里是www.test.com</h2>
</body>
</html> -
同路径下添加
index.js
文件测试js缓存,内容如下1
2
3function a(){
alert("a")
} -
在server文件夹下添加
cache.test.com.conf
(文件名可任意设置)配置文件,内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 虚拟主机
server {
listen 80;
server_name cache.test.com; # 浏览器访问域名
charset utf-8;
root /root/www/cache.test.com; # 访问根目录
# 路由
location / {
index index.html index.htm; # 入口文件
# try_files $uri $uri/ /index.html;
}
# 设置js缓存为30天
location ~ .*\.js$ {
expires 30d;
break;
}
} -
访问
cache.test.com
,查看F12
中js文件的请求信息,出现(memory cache)
为成功,如下图
防盗链
防止其他ip请求资源
1 | location ~* \.(gif|jpg|png)$ { |
静态文件压缩
1 | server { |
禁止文件缓存
1 | location ~* \.(js|css|png|jpg|gif)$ { |
后端
反向代理
为方便测试,需要完成以下几点
-
在hosts中添加
本机ip api.test.com
(将api.test.com
解析到本地) -
添加
/root/www/api.test.com/test.py
文件用来测试,内容如下1
2
3
4
5
6
7
8
9
10
11
12
13# -*- coding: UTF-8 -*-
# 引入框架
import flask,json
# 将本文件当做一个服务
server = flask.Flask(__name__)
# 制定一个测试接口
def index():
res = {'msg':'测试接口','code':0}
return json.dumps(res,ensure_ascii=False) # json转换并取消ascii转码
# 运行并监听8000端口
server.run(port=8000) -
在server文件夹下添加
api.test.com.conf
(文件名可任意设置)配置文件,内容如下1
2
3
4
5
6
7server {
listen 80;
server_name api.test.com; # 域名
location / {
proxy_pass http://localhost:8000; # 代理地址
}
} -
使用
python test.py
命令运行python并监听8000端口 ② -
访问
api.test.com/index
测试
负载均衡
-
在hosts中添加
本机ip load.test.com
(将load.test.com
解析到本地) -
添加
/root/www/load.test.com/test_8100.py
文件用来测试,内容如下1
2
3
4
5
6
7
8
9
10
11
12
13# -*- coding: UTF-8 -*-
# 引入框架
import flask,json
# 将本文件当做一个服务
server = flask.Flask(__name__)
# 制定一个测试接口
def index():
res = {'msg':'测试接口,端口为8100','code':0}
return json.dumps(res,ensure_ascii=False)
# 运行并监听8000端口
server.run(port=8100) -
添加
/root/www/load.test.com/test_8101.py
文件用来测试,内容如下1
2
3
4
5
6
7
8
9
10
11
12
13# -*- coding: UTF-8 -*-
# 引入框架
import flask,json
# 将本文件当做一个服务
server = flask.Flask(__name__)
# 制定一个测试接口
def index():
res = {'msg':'测试接口,端口为8101','code':0}
return json.dumps(res,ensure_ascii=False)
# 运行并监听8000端口
server.run(port=8101) -
在server文件夹下添加
load.test.com.conf
(文件名可任意设置)配置文件,内容如下1
2
3
4
5
6
7
8
9
10
11
12upstream loadapi {
# 负载均衡,配置权重
server localhost:8100 weight=1 max_fails=2 fail_timeout=3s;
server localhost:8101 weight=3 max_fails=2 fail_timeout=3s;
}
server {
listen 80;
server_name load.test.com;
location / {
proxy_pass http://loadapi; # 这里对应上面的 upstream loadapi
}
} -
使用
python test_8100.py
和python test_8101.py
运行两个python文件 -
访问
load.test.com/index
, 多次访问会出现{"msg": "测试接口,端口为8100", "code": 0}
与{"msg": "测试接口,端口为8101", "code": 0}
结果。
代理Nexus
1 | server { |
HTTPS
-
在hosts中添加
本机ip ssl.test.com
(将ssl.test.com
解析到本地) -
使用keymanager 生成一个测试证书(已有证书请忽略)
-
上传证书文件至
/etc/ssl/ssl.test.com
,路径可以自定义 -
在server文件夹下添加
ssl.test.com.conf
(文件名可任意设置)配置文件,内容如下 ③1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18server {
listen 80;
#ssl参数
listen 443 ssl;
server_name ssl.test.com;
root /root/www/www.test.com; # 访问根目录(这里主要测试https复用www的文件)
#证书文件路径
ssl_certificate /etc/ssl/ssl.test.com/ssl.test.com_chain.crt;
#私钥文件路径
ssl_certificate_key /etc/ssl/ssl.test.com/ssl.test.com_key.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
# 路由
location / {
index index.html index.htm; # 入口文件
# try_files $uri $uri/ /index.html;
}
} -
浏览器访问
https://ssl.test.com
可以正常访问就是成功,出现不安全是以为测试证书浏览器不信任。
遇到的问题
-
对应①,可能会出现
403 forbidden
错误,原因是未指定运行用户,主配置文件添加user root
即可。保证nginx的运行用户有权限访问文件路径即可 -
对应②,使用Python监听测试接口出现
Python“Non-ASCII character 'xe5' in file”
错误,原因为Python文件未指定字符集,文件第一行添加*# -\*- coding: UTF-8 -\*-*
即可。 -
对应②,python运行时出现
ImportError: No module named flask
, 缺少flask,运行yum install python-flask
即可 -
对应③,
the "ssl" parameter requires ngx_http_ssl_module
,原因是因为源码编译安装为开启ngx_http_ssl_module
,解决步骤如下-
进入nginx源码目录
cd /root/soft/nginx/nginx-1.18.0
根据自己的情况进入 -
运行
/usr/local/nginx/sbin/nginx -V
查看并复制configure arguments:
后面的值(路径可能不一致,未安装插件的情况下后面一般为空) -
运行
/usr/local/nginx/sbin/nginx -s stop
停止当前nginx,如果出现the "ssl" parameter requires ngx_http_ssl_module
,暂时把包含的配置文件删除即可。 -
在 nginx源码目录下运行
./configure --原来有的模块(如果有的话) --with-http_ssl_module
这里可能会出现
/configure: error: SSL modules require the OpenSSL library
Centos需要安装openssl-devel
yum install openssl openssl-devel
Ubuntu则需要安装:sudo apt-get install libssl-dev
-
编译
make
-
备份原有nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
-
复制新编译的nginx
cp ./objs/nginx /usr/local/nginx/sbin/
-
启动Nginx
/usr/local/nginx/sbin/nginx
-
验证查看
/usr/local/nginx/sbin/nginx -V
出现with-http_ssl_module
为成功
-