lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
ubuntu1604采用Nginx+uwsgi部署Django
2020-01-07 21:49:29
504
0
0
lee-romantic
##Nginx和uWSGI Nginx服务器负责接收浏览器的请求并将请求传递给uWSGI服务器,静态资源则由Nginx自己处理,非静态资源的HTTP请求则由Nginx传递给uWSGi服务器,然后传递给Django应用,最后由Django处理并响应,从而完成一次web请求。 这里会用到一些linux命令,linux系列之常用运维命令整理 https://blog.csdn.net/u014427391/article/details/102785219 ##nginx安装 nginx的安装可以采用编译源码的方式(下次再装nginx的话,源码编译可装更新一点的nginx),或者`apt-get`,这里我们直接在`base`环境中,采用`apt-get`,装的是一个老一点的`nginx`版本: ``` sudo apt-get upgrade #可能会卡住,非必须,更新软件列表,成功则会安装更新版本的nginx sudo apt-get install nginx #会有点慢,需要多等会儿 ``` 安装目录默认在`/etc/nginx/` 利用配置文件启动nginx,命令:` nginx -c /usr/local/nginx/conf/nginx.conf` 重启服务:` service nginx restart` 快速停止或关闭Nginx:`nginx -s stop` 正常停止或关闭Nginx:`nginx -s quit` 配置文件修改重装载命令:`nginx -s reload` 启动成功,直接在浏览器输入当前主机ip(或者`127.0.0.1`或者`0.0.0.0`,不输入端口)即可看到nginx欢迎页面。 ##nginx命令 ###(1)启动 ###启动: `nginx`实际上是个可执行文件,所以启动代码格式为:`nginx安装目录地址 -c nginx配置文件地址` 1、可以进入 `/etc/nginx/sbin`目录,执行: `nginx -c /path/to/nginx.conf` 2、可以直接,执行: `/etc/nginx/sbin/nginx -c/usr/local/nginx/conf/nginx.conf` 3、还可以采用默认配置(实际上包含多个地方的conf文件),直接启动:`sudo /etc/nginx/nginx` 如果配置了环境变量,则直接`sudo nginx`,不加`sudo`也可以,不过需要保证conf文件定义的log日志文件在普通用户就能修改的位置, 比如`/home/lb/`下面。 ###关闭: 1、快速停止nginx: `nginx -s stop ` 2、完整有序的停止nginx:`quit`或者`nginx -s quit` 3、通过杀死进程方式 : `ps -ef | grep nginx` 或者`ps ajx | grep nginx`:查进程 `kill -QUIT 主进程号` :从容停止Nginx `kill -TERM 主进程号` :快速停止Nginx `pkill -9 nginx` :强制停止Nginx 若nginx.conf配置了pid文件路径,如果没有,则在logs目录下 `kill -信号类型 '/usr/local/nginx/logs/nginx.pid'` ###重启: 进入 /usr/local/nginx/sbin目录 ####1、测试nginx配置文件是否正确 方法一:`nginx -t -c /path/to/nginx.conf` 或 方法二:`./nginx -t` 或者`nginx -t` ####2、重启Nginx服务: 方法一:`./nginx -s reload` :修改配置后重新加载 如果出现: ``` nginx: [error] invalid PID number "" in "/run/nginx.pid" ``` 则`sudo pkill -9 nginx`,然后`sudo nginx`重启。 方法二: `kill -HUP 进程号 `:平滑重启 `./nginx -s reopen` :重新打开日志文件 方法三:`service nginx restart`:重启服务 ###nginx的默认安装目录是: `/etc/nginx/conf` #配置文件 `/var/log/nginx/logs` #日志文件,access.log和error.log ##conf文件配置: 由于默认的nginx.conf文件里面有下面这样两句: ``` include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; ``` 因此不难发现,可以在三个路径下修改配置: (1)直接修改nginx.conf (2)修改sites-enbeld/文件夹下面的default文件,或者添加自定义的conf文件 (3)在conf.d文件夹下,新建自定义名称的*.conf文件并修改配置,我们采用这种方式: ``` cd /etc/nginx/conf.d/ sudo touch MyVideoSystem.conf sudo gedit MyVideoSystem.conf ``` 然后MyVideoSystem.conf中,如下配置: ``` server { # 监听端口号(填写自己的监听端口) listen 8090; server_name 127.0.0.1; charset utf-8; #client_max_body_size 75M; #由于需要传输视频流,故不设置上限 #项目的绝对路径(填写自己项目的绝对路径) #root /home/lb/PycharmProjects/MyVideoSystem/static; #uWSGI location / { include uwsgi_params; # 填写自己代理服务器要访问的端 uwsgi_pass 127.0.0.1:8081; uwsgi_read_timeout 30; } location /static { expires 30d; autoindex on; add_header Cache-Control private; # 静态文件的绝对路径 alias /home/lb/PycharmProjects/MyVideoSystem/static; } } ``` ##uWSGI的安装配置 我们使用的是conda环境,与前面的nginx不同,这里uwsgi需要在conda环境中装: ``` source activate Django pip install uwsgi #如果不行,则采用conda install,不过将装很多依赖项,甚至qt都装 ``` 完成后,可以输入uwsgi指令,测试uWSGI服务器能否正常运行: ``` #--chdir项目的绝对路径,-w 项目的wsgi.py文件 uwsgi --http:8098 --chdir /home/lb/PycharmProjects/MyVideoSystem -w MyVideoSystem.wsgi ``` 指令成功运行后,浏览器输入ip:8098就可以访问,只是没有css样式。 成功后,在项目的根路径下,创建uwsgi.ini文件,文件内容为: ``` [uwsgi] socket=:8081#和nginx通信的端口 pythonpath=/home/lb/PycharmProjects/MyVideoSystem #项目绝对地址,非必需 chdir=/home/lb/PycharmProjects/MyVideoSystem#必需,即便包含中文路径也行,建议不包含 module =MyVideoSystem.wsgi wsgi-file=MyVideoSystem/wsgi.py processes=1 threads=2 master=True pidfile=uwsgi.pid daemonize=uwsgi.log virtualenv = /home/lb/anaconda3/envs/Django#conda环境地址,必须,重要!!! ``` 这里特别注意,虽然这里的ini文件,可以使用`#添加注释,但是不要注释!!!`因为ini文件内不能有任何空格,之前就因为加了注释,且包含空格,导致uwsgi.log中一直出错,说找不到chdir的路径!!! 参考:https://blog.csdn.net/weixin_42292991/article/details/95976016 最后项目路径下,并且在conda环境中输入:`uwsgi --ini uwsgi.ini`启动uWSGI服务器即可,如果一切正常,则提示`[uWSGI] getting INI configuration from uwsgi.ini`且uwsgi.log中没有异常。 现在,两个web服务器均正常启动,输入ip:8090即可以正常访问(注意:我们这里8081端口做为nginx和uwsgi通信的端口,普通用户不用管)。 ##错误记录: ###(1)Nginx的erro.log中出现failed (13: Permission denied)错误,即权限问题: 出现了failed (13: Permission denied)错误,发现是权限的问题,解决办法为将/etc/nginx/nginx.conf中的第一行改为`user www-data` 改为`user root` https://www.cnblogs.com/xiaohuiduan/p/9867656.html https://blog.csdn.net/heiyueya/article/details/70740501 也有人说:RELOAD不靠谱,必须stop再启动才可以重启 停止`nginx -s stop` 重启`nginx -c nginx.conf` 测试... 搞定。 https://blog.csdn.net/xx5595480/article/details/51822821 ###(2)关于serve_name的一些问题: 如果server中配置了ip,那么我们就使用客户端带来的ip进行匹配,这个时候server_name失效: ``` 如果listen(0.0.0.0:XX),则这个可以被外部网络访问 而 listen(127.0.0.1:XX) 则这个端口只能被本机访问 https://blog.csdn.net/qq_40737025/article/details/85053164 ``` 当我们通过`/etc`下的hosts文件指定IP与域名的对应关系(如:`10.10.124.120 www.tesbas.com`)之后,对域名的访问会映射成对应的IP。这个ip就是nginx的公网IP(同一局域网),然后`server_name` 为虚拟服务器的识别路径,当nginx接到请求后,会匹配其配置中的service模块,匹配方法就是靠请求携带的host和port正好对应其配置中的server_name 和listen。因此不同的域名会转发到对应的应用服务器中去。 **默认端口80,这里注意有个坑:** 直接输入域名,即不加端口,比如www.vsst.com,默认的端口就是80。那么,nginx中的监听端口就该为80(当然,nginx默认端口就是80), 此时,如果server_name设为127.0.0.1或者0.0.0.0,那么局域网内,其他主机则不能通过202.115.52.50:80(:80可省略)访问我的服务器端的nginx,服务器端自身的浏览器可以通过127.0.0.1访问,但不能通过0.0.0.0访问。 除非将server name改为服务器ip `202.115.52.50`或者如果客户端hosts配置了`202.115.52.50 www.vsst.com`,且nginx的服务器端server name配置为`www.vsst.com`,那么也可以允许客户端以`www.vsst.com`访问。 由于80端口的特殊性,总结: ``` listen 80; server_name 127.0.0.1; #或者server_name 0.0.0.0; ``` 将会导致局域网内其他主机(自身通过ip同样无法访问)无法访问Nginx服务,且server_name 127.0.0.1导致自身只能以`127.0.0.1[:80]`访问,server_name 0.0.0.0导致自身只能以`0.0.0.0[:80]`访问! 而如果是: ``` listen 8090; #除了80以外的端口 server_name 127.0.0.1; #或者server_name 0.0.0.0; ``` 就不会有上面的问题。局域网或者服务器端自身都可通过ip:8090访问,服务器段还可以通过127.0.0.1:8090或者0.0.0.0:8090访问,甚至设置为server_name 127.0.0.1也可以通过0.0.0.0:8090访问! 80端口通常用于端口转发,通过域名来匹配对应的server: https://www.jb51.net/article/82046.htm
上一篇:
单调栈的理解和学习
下一篇:
ubuntu 16.04 git的使用方法
0
赞
504 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册