Nginx是一款自由的、开源的、高性能HTTP服务器和反向代理服务器。
- 轻量级,同样起web服务,比 apache占用更少的内存及资源
- 抗并发, nginx处理请求是异步非阻塞的,而 apache则是阻塞型的,在高并发下 nginx能保持低资源低消耗高性能;官方測试能够支撑5万并发连接,实际生产环境中能跑到2-3万并发连接
- 配置文件非常简单,风格和程序一样進俗易懂
- 提供负载均衡、反向代理,支持 rewrite,支持gzip压缩
- 稳定性高,宕机概率微乎其微
- 开源,可免费使用
安装Nginx
来源于
- 下载相关组件
[root@localhost src]# wget http://nginx.org/download/nginx-1.10.2.tar.gz
省略安装内容...
[root@localhost src]# wget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gz
省略安装内容...
[root@localhost src]# wget http://zlib.net/zlib-1.2.11.tar.gz
省略安装内容...
[root@localhost src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
省略安装内容...
- 安装Nginx及相关组件
openssl安装
[root@localhost src]# tar zxvf openssl-fips-2.0.10.tar.gz
省略安装内容...
[root@localhost src]# cd openssl-fips-2.0.10
[root@localhost openssl-fips-2.0.10]# ./config && make && make install
省略安装内容...
pcre安装
[root@localhost src]# tar zxvf pcre-8.40.tar.gz
省略安装内容...
[root@localhost src]# cd pcre-8.40
[root@localhost pcre-8.40]# ./configure && make && make install
省略安装内容...
zlib安装
[root@localhost src]# tar zxvf zlib-1.2.11.tar.gz
省略安装内容...
[root@localhost src]# cd zlib-1.2.11
[root@localhost zlib-1.2.11]# ./configure && make && make install
省略安装内容...
nginx安装
[root@localhost src]# tar zxvf nginx-1.10.2.tar.gz
省略安装内容...
[root@localhost src]# cd nginx-1.10.2
[root@localhost nginx-1.10.2]# ./configure && make && make install
省略安装内容...
- Nginx基本操作
启动
[root@localhost ~]# /usr/local/nginx/sbin/nginx
停止/重启
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop(quit、reload)
命令帮助
[root@localhost ~]# /usr/local/nginx/sbin/nginx -h
验证配置文件
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
启动nginx 使用`ps -ef | grep nginx`查看nginx进程是否启动
启动成功 访问本地127.0.0.1 会出现Nginx的欢迎界面
uwsgi安装
通过pip安装
pip install uwsgi
uwsgi配置文件
在我们的项目目录中创建一个uwsgi.ini配置文件
我的配置文件如下
[uwsgi]
uid=root #使用权限
pid=root
socket = 127.0.0.1:8008 #地址和端口号
http=0.0.0.0:8000 #http监听
harakiri = 300 #超时设置
pidfile=/opt/CowRestAPI/uwsgi.pid #指定pid文件的位置,记录主进程的pid号
vacuum=true #当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
limit-post= 67108864 #限制HTTP请求体的大小
chair=/opt/CowRestAPI #项目的目录
thunder-lock = true #序列化接受的内容
master = true #主进程
wsgi-file = /opt/CowRestAPI/api.py #载入wsgi-file
callable = app #callable指出的是具体执行.run方法的那个实体的名字,一般而言都是app=Flask(__name__)的,所以这里是app
processes = 1 #进程数量
threads = 4 #线程数量
daemonize = /opt/CowRestAPI/uwsgiserver.log #使用进程在后台运行,并打印日志
touch-reload = /opt/CowRestAPI/api.py #flask的启动文件
stats = 0.0.0.0:8080 #指定的地址开启状态服务
buffer-size = 32768 #设置用于uwsgi包解析的内部缓存区大小。默认是4k
在不使用Nginx的情况下
需要配置http=0.0.0.0:8000 (本地)
或者输入自己的公网IP加端口
在自己的项目目录下
使用`uwsgi uwsgi.ini`启动项目
然后访问自己的 ip + 端口 可以正常访问自己的项目
使用uwsgi+Nginx的情况下
需要配置socket不能使用http
Nginx的配置文件
在自己下载的nginx文件中会有一个nginx.conf
我的nginx配置文件如下
部分也有注释说明可以参考
nginx.conf
user root; #使用指定用户
#user nobody;
worker_processes auto; #使用的worker进程数
#error_log logs/error.log; #错误日志问价
#error_log logs/error.log notice; #日志级别
#error_log logs/error.log info;
#pid logs/nginx.pid; #存放进程pid
events {
worker_connections 1024; #每个worker最大连接数默认1024
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
fastcgi_buffers 8 128k;
send_timeout 60;
server {
listen 80; #监听的端口 可以添加多个 listen 81
#listen 81;
server_name 47.93.37.167; #自己的公网ip 本地直接localhost Nginx可以监听多个域名
client_max_body_size 10m; #最大的报文,默认1m
rewrite /baidu/(.*) https://baidu.com; #重定向 访问/baidu/...就会跳转指定的url页面
location / {
include uwsgi_params; #说明与uwsgi进行连接
uwsgi_param UWSGI_CHDIR /opt/CowRestAPI; #项目目录
uwsgi_param UWSGI_SCRIPT api:app; #api为flask项目启动文件,app是run方法的那个实体的名字,一般而言都是app=Flask(__name__)的
uwsgi_pass 127.0.0.1:8008; #此处的ip和端口需要和uwsgi配置文件中的socket一样,才能建立连接
}
location - /\secret\/(.*)$ {
return 403; #访问secret 返回403 隐藏
}
}
}
如果访问出现nginx 504 Gateway Time-out的错误
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点
在nginx.conf里, 加入:
fastcgi_buffers 8 128k
这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点, 例如设置成60秒:
send_timeout 60;
我只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错
如果还有此类问题可以参考以下链接
nginx的location配置详解
语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
反向代理
http {
include mime.types;
default_type application/octet-stream;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
fastcgi_buffers 8 128k;
send_timeout 60;
server {
listen 80; #监听的端口 可以添加多个 listen 81
#listen 81;
server_name localhost;
location / {
proxy_pass http://192.168.1.101:9000; #反向代理
#以下是一些反向代理的配置可删除
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}
}
Nginx负载均衡 反向代理
Nginx.conf 其中的设置
http {
include mime.types;
default_type application/octet-stream;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
fastcgi_buffers 8 128k;
send_timeout 60;
upstream nginx_test {
#ip_hash #只访问到了一台 保持session的一致性
server 192.168.1.101:9000 weight=1 max_fails=5 fail_timeout=20s;
#设置健康检查和超时时间 加上down 暂时不参与负载
server 192.168.1.102:9000 weight=3; #两台服务ip weight代表比重 越大访问次数越多
}
server {
listen 80; #监听的端口 可以添加多个 listen 81
#listen 81;
server_name localhost;
rewrite /baidu/(.*) https://baidu.com; #重定向 访问/baidu/...就会跳转指定的url页面
location / {
proxy_pass http://nginx_test;
}
}
}