nginx+uwsgi部署实践的踩坑总结(一)

部署情景描述:

这周我的外包项目进入了部署阶段。这个项目采用了vue前端+django后端, vue前端打包成静态文件,通过nginx服务器负责vue静态文件请求的处理和反馈。django项目采用目前最普遍的uWSGI服务器运行,再通过nginx反向代理vue框架对后端的请求。
部署使用的服务器是阿里云ecs云服务器,配置是2核4G,1M带宽。

OS: Debian 9.2 stretch
Kernel: x86_64 Linux 4.9.0-4-amd64


1.nginx如何配置对前端vue资源的请求

如果前端vue没有使用服务端渲染的话,只需要将项目使用 npm run build 打包到一个 dist 文件夹下。可以通过 ftp,github等诸多方式将dist传到服务器上。我将这个dist文件夹放在了/home/temp/下。
如果 vue-router使用的是history模式(url里没有’#'这种符号),需要采用如下配置:

location /{
	root /home/temp; # my dist directory
	index index.html;
	try_files $uri $uri/ /index.html = 404;
}

这个配置意思是 :遇到没有匹配到的url,就在 dist文件夹里面 寻找index.html,如果有,就返回index.html(即前端页面), 如果没有,就返回404。
####2.第一次启动nginx显示80端口被占用
报错如下:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

可以用

fuser -v -n tcp 80

查看80端口的使用情况
结果如下:

                     USER        PID ACCESS COMMAND
80/tcp:              root      30148 F.... python

只要直接杀死占用端口的进程,就可以了,命令如下:

kill -s 9 pid #具体的pid值

再次

sudo service nginx start

就不会报错了


3. nginx 配置正确,正常启动,但是在远程访问ip地址, 依旧无法访问

在nginx 配置正确,正常启动后,依旧有一个新手在使用阿里云服务器时会遇到的坑。
原来,阿里云服务器默认关闭了所有的端口。
nginx+uwsgi部署实践的踩坑总结(一)_第1张图片
在这个管理界面里,在更多选项里,有一个安全组配置,按照提示将相应的端口加入安全组配置中。 之后就可以正常访问ip的相应端口了。

####4.uwsgi 的相关配置
uwsgi 的配置全程只需要两个配置文件。
一个是 uwsgi_params ,这个文件要放在自己的python项目的根目录下。
这个文件的内容是完全固定的,用于nginx 和 uwsgi 之间的请求格式的转换。
文件的内容我是从 uwsgi文档 复制过来的。
uwsgi_params的内容如下:

uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_ADDR $server_addr;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

另一个文件是 uwsgi服务器的主要配置,这个文件的存放位置以及文件的名字随意,因为在启动uwsgi时需要在启动命令中指定该配置文件的绝对位置以及文件名字。
以我的配置文件为例,我放在了 /etc/uwsgi/sites/ 文件夹下,名叫 uwsgi.ini
以下是我的配置文件,内容仅供参考,请结合自己的实际项目来配置

[uwsgi]
pidfile = /var/run/uwsgi.pid # 存储uwsgi运行的pid值的文件
daemonize = /home/myproject/myproject.log  # 存储运行的日志文件, myproject 是我的项目文件夹

chdir = /home/myproject/  # 项目文件夹的位置
module = myproject.wsgi:application

master = true # 指定启动主进程
chmod-socket = 664  # 运行时的权限
processes = 5  # 设置工作进程的数量
socket = /home/myproject/myproject.sock  # socket文件的位置,运行时自动生成
vacuum = true # 当服务器退出时自动删除unix socket文件和pid文件

还有一些常见的配置在这篇文章里有详细介绍。


关于uwsgi踩过的更多坑,请移步nginx+uwsgi部署实践的踩坑总结(二)

你可能感兴趣的:(nginx,uwsgi)