nginx+uwsgi部署实践和问题解决(一)
部署情景描述:
这周我的外包项目进入了部署阶段。这个项目采用了vue前端+django后端, vue前端打包成静态文件,通过nginx服务器负责vue静态文件请求的处理和反馈。django项目采用目前最普遍的uWSGI服务器运行,再通过nginx反向代理vue框架对后端的请求。
部署使用的服务器是阿里云ecs云服务器,配置是2核4G,1M带宽。
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 配置正确,正常启动后,依旧有一个新手在使用阿里云服务器时会遇到的坑。
原来,阿里云服务器默认关闭了所有的端口。
在这个管理界面里,在更多选项里,有一个安全组配置,按照提示将相应的端口加入安全组配置中。 之后就可以正常访问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文件
推荐阅读