K8S Ingress环境下,Http Redirect端口丢失问题

近日发现一个问题:应用程序在返回Http Redirect的时候丢失了原先访问的端口。比如,我们这样访问http://IP-A:Port-A/app/delete,这个url会响应302,但是它返回的Response header Location里丢失了端口,正确的结果应该是这样:http://IP-A:Port-A/app/index,但返回的却是:http://IP-A/app/index,把端口丢失了。

基本情况

我们的部署情况是这样的:

  • 部署了Nginx Ingress,并使用NodePort的方式把Nginx Ingress Service暴露出来
  • 配置了App的Ingress

服务器信息:

未分类

其实以上也不全是服务器,其中有两个K8S Service不是服务器,它们是VIP,关于这个请看K8S – Using Source IP一文,当访问http://IP-A:Port-A/app/delete的时候,这个请求从左到右贯穿了这些服务器。

顺便一提上面的NAT Server是一台普通的服务器,我们用它做了PAT使我们的Nginx Ingress能够被外网访问到。

观察

我们使用之前提到过的Echo Server来观察透过Ingress访问Echo Server时传递给Echo Server的Request header:http://IP-A:Port-A/echo-server,得到了这些有趣的Request header:

host=IP-A:Port-A
x-original-uri=/echo-server
x-forwarded-for=IP-B
x-forwarded-host=IP-A:Port-A
x-forwarded-port=80
x-forwarded-proto=http

然后直接访问Echo Server Svc,发现是没有上面提到的x-*Request header的。于是怀疑问题出在这几个header上。

名词解释

来讲一下这些头各自代表什么意思。

  • x-forwarded-for,client访问proxy的时候,client的ip。
    在这里之所以是K8S Node的IP,是因为在Nginx Ingress看来请求是来自K8S Node的(好好看看之前提到的K8S – Using Source IP一文),在这之前的NAT它是不知道的。
  • x-forwarded-host,client访问proxy的时候,访问的原始host。
  • x-forwarded-proto,client访问proxy的时候,访问的原始http scheme。
  • x-forwarded-port,client访问proxy的时候,访问的port。
  • x-original-uri,查不到权威资料。

注意,前三个是事实标准,MDN有收录,x-forwarded-port和x-original-uri似乎是私有扩展。

实验

找一个趁手的Http Request工具(我用的是Postman),记得把Follow redirect关掉,然后模拟Nginx请求的方式(就是把上面提到的x-* header带上/去掉/修改值)直接请求App Svc。

结果发现x-forwarded-port是Response header Location的关键,即如果x-forwarded-port=Port-A的话,Location就会带上正确的端口。

分析

Redirect url是如何构造的

可以推测,App利用了host和x-forwarded-*这些header来构造redirect url。

在Java Servlet API中,在描述HttpServletResponse#sendRedirect的时候提到,其返回的URL必须是Absolute URL。

Tomcat的org.apache.catalina.connector.Response的toAbsolute方法负责构造Absolute URL。

那么它又是如何知道选用什么Port的呢?这个和RemoteIPValve有关,有兴趣的话你可以查阅相关文档。

上面只是讲了Tomcat是如何构造redirect url的,但这个方法不是标准的,不同的容器有各自的实现,毕竟Java Servlet API也没有规定如何构造Absolute URL。

我之前也写过一篇相关话题的文章《反向代理使用https协议,后台tomcat使用http,redirect时使用错误协议的解决办法》,你可以看一看。

为何x-forwarded-port是80

那么问题来了,我明明访问的是IP-A:Port-A,为何Nginx取到的值是80?

这是因为在整个请求链路的前段:NAT Server > K8S Node > Nginx Ingress Svc 都是在第4层工作的,可以认为它们干的事情都是NAT,Nginx Ingress Pod是不知道这些服务器/网络节点的端口,因此它只能把自己的端口80(容器内Port)给x-forwarded-port。

关于这个逻辑你可以查看Nginx Ingress的配置文件就能够知道了:

kubectl -n kube-system exec -it <nginx-ingress-controller-pod-name> -- cat /etc/nginx/nginx.conf

解决办法

请求时带上x-forwarded-port(不靠谱)

查看Nginx Ingress配置文件发现如果最初请求的时候带上x-forwarded-port的话,就能够改变它传递到后面的值,但是这有两个问题:

  • 通过浏览器访问时,你没有办法加上这个header
  • 这个header一般都是反向代理加的,也就是在我们的Nginx Ingress之前还得有一个反向代理

所以这个方法不好。

修改tomcat的代码(不靠谱)

虽然可以通过修改tomcat的代码,让它从x-forward-host/host header来取port,但是这个不现实。

修改NAT Server的端口为80(靠谱)

这个方法比较靠谱,只要将NAT Server的端口改成80就没有问题了。

事实上,如果你直接访问K8S Node的话(NodePort方式),也是要将NodePort设置为80,记得前面说的吗?Nginx Ingress无法知道上层NAT的端口。

总而言之,就是你最初请求的URL不能是80之外的端口,必须是http://some-ip/app才可以。

使用Nginx Ingress Annotations(靠谱)

使用Nginx Ingress提供的Proxy redirect annotations(https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#proxy-redirect),将Location的值做文本替换。

深入玩转K8S之利用Label控制Pod位置

首先介绍下什么是Label?

Label是Kubernetes系列中一个核心概念。是一组绑定到K8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。

通过给指定的资源对象捆绑一个或多个不用的label来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作。

默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些实际情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

下面我们来实际的操作下,比如执行如下命令标注 k8s-node1 是配置了 SSD的节点。

kubectl label node k8snode1 disktype=ssd

然后通过 kubectl get node –show-labels 查看节点的 label。

未分类

可以看到disktype=ssd 已经成功添加到 k8snode1,除了 disktype,Node 还有几个 Kubernetes 自己维护的 label。有了 disktype 这个自定义 label,接下来就可以指定将 Pod 部署到 k8snod1。比如我编辑nginx.yml,增加nodeSelector标签,指定将此Pod部署到具有ssd属性的Node上去。

未分类

最后通过kubectl get pod -o wide。

如果要删除 label disktype,就执行如下命令删除即可:

kubectl label node k8s-node1 disktype-

但是要注意已经部署的 Pod 并不会重新部署,依然在 k8snode1 上运行。可能会有人说了,那怎么让Pod变回原样呢也就是分配到多个node上,那就需要一个笨方法了(至少在目前我学习的方法里面只会这样操作),就是在刚才编辑的那个nginx.yml文件里面删除nodeSelector标签,然后在利用kubectl apply重新部署,Kubernetes 会删除之前的 Pod 并调度和运行新的 Pod。

未分类

好了本次的Label标签的实践讨论到此结束,本文参考了Kubernetes 官网和每天5分钟玩转K8S。

【Linux】执行 service iptables save 命令异常解决

遇到问题

  博主在 CentOS7 安装 Redis 的过程中,使用 iptables 命令添加完 iptables规则以后,需要保存规则永久生效,当执行 service iptables save 命令时提示以下错误信息:
  
未分类

问题原因

  遇到此问题是因为没有安装 iptables 服务,因此需要先安装 iptables 服务。

解决方案

1. 关闭防火墙

systemctl stop firewalld
systemctl mask firewalld

2. 安装 iptables 服务

yum install iptables-services

3. 设置 iptables 服务开机启动

systemctl enable iptables

 

4. 重启 iptables 服务

systemctl restart iptables

 

5. 执行保存配置命令

service iptables save

Docker使用zookeeper

Apache ZooKeeper是一个开源的服务器,可以实现高度可靠的分布式协调。
记录Docker里面使用zookeeper的方法

镜像

docker pull zookeeper

启动一个Zookeeper服务器实例

启动一个zookeeper实例很简单:

docker run --name some-zookeeper --restart always -d zookeeper

由于Zookeeper “fails fast”,最好始终重新启动它。

这里可以加上-p参数把端口映射到主机端口:

docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper

这样, 就把容器的2181端口映射到宿主机器的2181端口上了, java程序等可以直接连接(127.0.0.1:2181)

从另一个Docker容器中的应用程序连接到Zookeeper

docker run --name some-app --link some-zookeeper:zookeeper -d application-that-uses-zookeeper

从Zookeeper命令行客户端连接到Zookeeper

docker run -it --rm --link some-zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper

查看日志

docker logs -f e36790ea5c5e

其中e36790ea5c5e是容器的ID, 可以通过docker container ls 来查看.

END

解决 error creating overlay mount to /var/lib/docker/overlay2

最近在centos7.1使用docker运行redis镜像,出现下面的错误:

/usr/bin/docker-current: Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/65f3c109fb903539820f84856d2725af784f2f03f95b1f0214e34184e4d61ff7-init/merged: invalid argument.
See '/usr/bin/docker-current run --help'.

在网上搜索一番后,一个可行的方案如下(改变storage driver类型, 禁用selinux):

停止docker服务

systemctl stop docker

清理镜像

rm -rf /var/lib/docker

修改存储类型

vi /etc/sysconfig/docker-storage

把空的DOCKER_STORAGE_OPTIONS参数改为overlay:

DOCKER_STORAGE_OPTIONS="--storage-driver overlay"

禁用selinux

vi /etc/sysconfig/docker

去掉option的–selinux-enabled

启动docker应该就可以了

systemctl start docker

方案抄自 Ysssssssssssssss的博客 和 redis的讨论: error creating overlay mount to …/merged: invalid argument., 基本可以确定是启用selinux导致的。

Ubuntu中apt命令自动补全设置

在Ubuntu中安装软件和包,apt命令是必不可少的,虽然类似于Python的pip一样十分方便,但安装的包名却是一个比较烦人的问题。 需要安装的报名太长、单词记不住、版本号不对(对于有些依赖库而言,要求是版本号是完全对应的,低的高的都不行,不适用向下兼容原则)等等问题,所以如果可以有包名的自动补全功能就好了。 而事实上也是有的,但似乎默认并没有开启。因为在新安装的系统上试了一下,是不会自动补全的。 所以下面记录一下设置步骤。

1. 安装bash-completion

在终端输入命令

apt-get install bash-completion

一般情况下这个包应该系统都自动装好了,如果没有就装一下。

2.修改配置文件

在终端中输入以下命令

gedit /etc/bash.bashrc

这样就能用Gedit打开配置文件,找到被注释掉的蓝色的一段代码,如下所示。

未分类

把这段代码取消注释,并保存,如下所示,即可使自动补全功能生效了。

未分类

3.测试

之前一直需要安装一个libcholmod的库,但是按照书上给的libcholmod-dev提示找不到包,在网上找了找,说是版本不对。 有说装libcholmod2.1.2成功的,有说装libcholmod3.0.14成功的,可惜的是在我电脑上两个都不行。 而且之前没有设置apt的自动补全,所以完全不知道我的电脑应该装哪个版本。但在设置了自动补全后终于可以了,原来我的电脑对应的版本是3.0.6,如下所示。

未分类

这样配置apt自动补全就大功告成了,成功解决了一个我的问题。

4. 题外话

关于apt自动补全,我看网上也有博客说修改~/.bashrc文件的,如这篇和这篇博客,但经过我的测试,在我的电脑上无效,而且设置完后还报了.:command not found的错误。 而且我看了~/.bashrc的文件内容如下。

未分类

上面博客中说的添加的内容其实就是这里被注释掉的蓝色部分。而稍微阅读一下注释就会发现,人家说,你不需要在这里开启这段代码,如果它已经在/etc/bash.bashrc中开启了的话。 而我们上面其实是按照系统的提示,修改了/etc/bash.bashrc,所以就不需要再改这里了。 当然如果你按照我上面的方法修改不起作用,那你可以按照刚提到的这两篇博客的内容试试,应该也是可以的。

Ubuntu apt 本地源 离线安装

今天一台主机(Ubuntu 14.04)不知道为什么连不上外网了。只能和局域网内的其他主机相互ping通。但是上面一个正在跑的程序出了问题,需要安装两个额外的包,而且这两个包依赖还挺多的样子。这可急死我了。但是我另一台笔记本可以上外网。碰巧也安装的是Ubuntu14.04。我就想能不能把要安装的包先在笔记本上下载好,然后通过U盘转移到前面那台主机上,再在那台主机上通过本地包安装呢?通过网上一番搜索后,终于搞定了。现在总结一下步骤。

在能上网的笔记本上下载好需要的包

$ sudo rm -rf /var/cache/apt/archives/*  # 清空缓存目录,这一步也可以不做
$ sudo apt-get -d install <包名>

运行完该命令后,需要的包及依赖都会下载到 /var/cache/apt/archives。

复制到U盘中

将下载好的包( /var/cache/apt/archives目录下的所有文件)复制到U盘中,准备转移。如果你不想拷贝多余的包文件,你可以提前将 /var/cache/apt/archives 目录清空后再下载需要的包。

# 先在U盘中创建好一个目录debs
$ sudo cp -r /var/cache/apt/archives/* /U盘/路径/debs/

下面转到不能上网的主机上操作

在主机上创建包缓存目录

$ sudo mkdir /var/debs

将U盘中下载好的包文件全部复制到/var/debs目录下

$ sudo cp -r /U盘/路径/debs/* /var/debs/

生成包索引文件

$ sudo touch /var/debs/Packages.gz
$ sudo chmod -R 777 /var/debs/  # 这一步是为了获得文件的可写可读可执行权限,要不然后面会失败
$ sudo dpkg-scanpackages debs  /dev/null  | gzip > debs/Packages.gz  # 创建索引

在 /etc/apt/sources.list 中添加本地目录

$ sudo gedit /etc/apt/sources.list

将sources.list 原来的内容都注释掉。在最后添加

$ deb file:/var debs/

注意上面的 /var 和 debs/ 之间的空格,以及 “/”。不要写错/var/debs/路径了。

更新索引

$ sudo apt-get update

结束

现在可以安装包了。运行sudo apt-get install <包名> 就会像以前一样安装好了指定的包了。

Nginx和Apache如何设置ajax跨域

关于ajax跨域的就不过多的介绍,可以参考改文章http://www.qqdeveloper.com/a/75.html

方式一:在被请求的应用程序中添加一个允许请求跨域

1.apache

1.在httpd.conf文件中加载
    LoadModule headers_module modules/mod_headers.so模块
2.在被请求文件头部添加:
header("Access-Control-Allow-Origin: *");

2.nginx

1.在被请求文件头部添加:
    header("Access-Control-Allow-Origin: *");

方式二:在配置文件中允许跨域

1.apache的配置文件httpd.conf

    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
    Header set Access-Control-Allow-Origin * #此行代码即是需要添加的代码2.nginx

2.在被请求的域名nginx配置文件中增加配置,配置位置和root的配置等级一致

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

该方式配置参考链接:http://www.nginx.cn/4592.html

大坑之Apache配置CGI&解决提示500错误

艾玛!这两天可把我累的够呛,心累的那种,用python写了个API想放在Apache服务器上面利用CGI使用,但是整了两个晚上,经过无数次尝试和失败,最终终于搞定了,最终豁然开朗的感觉,才觉得这特么真是非常的坑。

先简单介绍一下Apache的CGI

Apache都不知道是啥的大兄弟就自己去百度吧。。CGI你可以理解为它的一个接口,利用CGI你可以实现各种脚本的运行,只要你的服务器可以运行的脚本都可以,通过服务器运行脚本,然后将允许结果最终以HTML的形式显示给浏览器。Apache根目录如下:

  • bin:Apache服务器软件所在地
  • cgi-bi:保存自己写的CGI脚本程序
  • conf:保存服务器设置的信息
  • error:网站发送错误的处理
  • htdcocs:保存HTML程序
  • icons:保存开发Apache程序用的图标
  • include:保存开发web程序用到的一些头文件
  • lib:保存的是开发web程序用到的一些库
  • logs:日志
  • manual:Apache服务器语言的设置
  • modlules:保存一些动态链接库

一般我们常用的文件夹就是上面标红的那两个。、

开始配置:

声明一下,一般Apache的默认配置CGI都是开启的,可以在服务器的Apache的配置文件中看到配置情况,这里以Ubuntu14.4的Apache2为例看一下。
先进入apache2的主目录并查看文件夹,默认的apache2的默认目录在/etc/apache2

未分类

可以看到在这个目录下面有很多的文件夹和配置文件,Apache2其实是将各个模块的配置分文件夹保存了,这个CGI的配置文件在上图箭头指向的那个文件夹内,现在进入这个文件夹

未分类

这个serve-cgi-bin.conf文件就是我们要找的文件,使用vim编辑器打开这个文件

未分类

上图第一个箭头指向配置

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

这句话是用来设置别名的,就是说你在使用url访问的时候,当遇到/cgi-bin/这个目录的时候服务器会自动去/user/lib/cgi-bin/目录下面查找要访问的文件,这句话有时候可以不写,但前提是cgi的文件目录要在web的根目录下第二个箭头指向的配置

<Directory "/usr/lib/cgi-bin">
      AllowOverride None     #显示目录
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch    #可以运行的模块
      Require all granted   #允许所有的请求
</Directory>

注意上面标红的位置,/usr/lib/cgi-bin/要和上面的别名一致,这个地方是个可以改动的,你可以自己选定别的文件夹,当作CGI的根目录,只要设置好目录可以访问就好,然后+ExecCGI要有,这个是加载CGI模块的选项,没有是不行的。可以看到,我们并没有声明可以运行那些脚本,所以Apache会全面默认运行。只要在脚本中指定执行程序的路径即可。下面我们会讲到。好了,文件的配置完并保存之后重启服务器,然后就可以去测试一下了。

Apache2的重启命令:

sudo /etc/init.d/apache2  restart

Apche CGI 文件测试

根据上面配置的别名,我们在浏览器访问一下试试

未分类

可以看到提示的是403然后说没有权限访问这个目录而不是404,说明找到了这个文件,只不过我们没有访问脚本文件,又不允许列出目录,所以提示403,下面我们编写一个CGI脚本测试一下,这里我使用Python来测试,代码如下:

#!/usr/bin/python           #CGI运行程序的目录
# -*- coding: UTF-8 -*-

print "Content-type:text/html"
print                               # 空行,告诉服务器结束头部,CGI必须的部分
print '<html>'
print '<head>'
print '<meta charset="utf-8">'
print '<title>Hello Word - 我的第一个 CGI 程序!</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! 我是来自菜鸟教程的第一CGI程序</h2>'
print '</body>'
print '</html>'

上面的两个人注释的部分必须注意,规则不可以变。

写在python文件里面命令为t2.py,然后对文件进行权限的设置,让它具有可执行权限,注意,这一块很重要,要不然会提示500错误的

chmod  777 /usr/lib/t2.py

然后再浏览器中访问测试

未分类

仍然是500错误,其实这个才是我这篇博文的重点,这个坑我觉得肯定是坑死过很多人,这个流程明明没有问题,怎么还会出现问题呢?经过我多次的尝试,多次的失败,多次的googl,多次的baidu,就特么差放弃了,我特么成功了。我觉得我的配置没有问题,那么问题肯定出在CGI文件上面,通过测试发现,有两个地方必须要注意:

注意1

# -*- coding: UTF-8 -*-
上面这句话是用来声明utf8编码的,若文件中存有中文必须声明utf8编码格式,但是在这,这句话似乎不管用了,必须使用’

#coding:utf8
用上面的生命替换以前的代码之后,重新访问浏览器,结果仍然是500。重点在下面

注意2

在linux中新建的文件和在windows上面新建的文件是不同的,在CGI中运行的文件必须是unix文件编码格式,所以会出现500错误的!对于这个问题我测试了很久,虽然说vim编辑器有将文件编码格式转换为unix命令:set ff = unix ,但是结果还是不行,依然是500错误!但是,在linux上面使用vim新建的文件却可以正常运行。具体这个问题到底是怎么回事我也没有具体搞清楚,但是最不会出错的方法就是在linxu上面直接新建和编辑文件,或者在linux上面新建文件之后拿到本地用IDE编辑,注意!最好不要使用记事本,在测试中发现有时候记事本的BOM头也会影响程序执行。

既然知道了问题的原因,那么我们在linux上面使用vim新建文件并将代码复制过去,然后运行测试。

未分类

可以看到这样就成功了。两个晚上,闹心的,就是解决不了的问题,坑太多了,最终还好解决了,不然就要骂娘了。。!

Django+Linux+Uwsgi+Nginx项目部署文档

WSGI

在生产环境中使用WSGI作为python web的服务器

WSGI:全拼为Python Web服务器网关接口,Python Web服务器网关接口,是项目默认会生成一个wsgi.py文件,确定了设置模块,uWSGI实现了WSGI的所有接口,是一个快速,自我修复,开发人员和系统管理员友好的服务器,C语言编写,效率高

Nginx

使用nginx的的作用主要包括负载均衡,反向代理

项目通过Django+Uwsgi+Nginx进行线上服务器部署

1、文件打包传服务器,通过xshell

文件 > 传输 > ZMODEM > 用ZMODEM发送 > 文件或压缩包

Linux下压缩包解压命令:

zip格式 : unzip 压缩包路径

tar.gz格式 : tar zxvf 压缩包路径

(rar格式压缩包解压较为复杂,尽量别传rar格式)

2、Xshell使用技巧

文件 > 新建,开启多终端

建议开多终端,这样对uwsgi、Nginx、项目代码进行调试修改时,可以避免在一个终端下来回切换目录,提高工作效率,具体开终端的个数根据实际需求来定,并且右击tab终端名重命名,更加方便知道哪个终端对应做哪些事情
未分类

3、修改配置文件问题

不管修改uwsgi的配置文件uwsgi.ini还是修改nginx配置文件nginx.conf,修改完都必须重启服务才能生效,并且启动服务要在指定的目录下面重启

4、Uwsgi的安装

方法1、pip install uwsgi(有网的情况下)

方法2、没网情况下去官网下载uwsgi压缩包,为tar.gz格式,传到服务器,进行解压,解压路径/lib/目录下面,然后切换到uwsgi文件目录,执行以下两个命令,即可完成安装,示意图如下(解压路径可以自定义,记下来,方便以后进行维护)

python setup.py  build

python setup.py  install

未分类

5、Django项目中配置uwsgi

1、项目目录(例如本例中DataBusines)下创建uwsgi.ini文件,配置如下

本地测试一般用:127.0.0.1即可,端口可以自定
未分类

线上的话用线上服务器IP,端口自定,该配置访问地址需要和nginx.conf中的配置一样
未分类
例如:这是后面的nginx.conf配置文件,两者地址和端口需要一致
未分类

6、Uwsgi的使用(启动、查看进程、关闭)

启动uwsgi.ini,需要切换到项目目录

启动uwsgi: uwsgi –ini uwsgi.ini

查看uwsgi进程:ps ajx|grep uwsgi

关闭uwsgi:

查阅相关资料文档,提到多种命令关闭方式,关闭命令的意义在于修改配置文件后,

一般需要重启uwsgi才会生效

1、uwsgi –stop uwsgi.pid(不好用,经常报pid找不到)

2、sudo pkill -f uwsgi -9(不好用,有可能报错,无效的-9)

3、killall -9 uwsgi(该命令最好用)
未分类

7、通过uwsgi网页访问

因为uwsgi本身就是web服务器,我们可以通过更改配置直接通过uwsgi进行访问网页

如下图:我们在服务器通过vi更改配置文件为http请求模式,更改后保存并重启uwsgi服务器,在我们自己的浏览器访问设置的IP和端口,成功显示页面,证明uwsgi配置成功

http模式: 直接用uwsgi时使用

socket模式: 使用Nginx时使用
未分类
未分类

8、Nginx的安装

方法1、pip install nginx(官方提供有该方法,但是之前在本地测试遇到坑,没有配好,建议通过方法二中压缩包方式安装)

方法2、没网情况下去官网下载nginx压缩包,为tar.gz格式,传到服务器,进行解压,解压路径/lib/目录下面,然后切换到nginx文件目录,执行以下三个命令,进行安装

./configure

make

sudo make install

未分类
执行完以上命令后,nginx被安装在了/usr/local/nginx/,安装成功
未分类

9、nginx的使用(启动、查看进程、关闭)

进入nginx安装目录:cd /usr/local/nginx/

启动nginx: sudo sbin/nginx

查看nginx进程: ps ajx|grep nginx

关闭uwsgi:

查阅相关资料文档,提到多种命令关闭方式,关闭命令的意义在于修改配置文件后,一般需要重启nginx才会生效

1、sudo sbin/nginx –s stop(不好用,报异常无效的-s)

2、sudo pkill -f uwsgi -9(不好用,报错,无效的-9)

3、killall -9 nginx(该命令最好用)

命令报错示意
未分类

10、nginx的配置文件nginx.conf配置

具体如图中所示,配置文件目录/usr/local/nginx/conf/nginx.conf,配置文件的修改需要通过vi进行修改
未分类
未分类

11、静态资源配置

配置静态资源目录是因为让静态资源通过nginx可以直接返回,不需要通过uwsgi,也就是让uwsgi只处理后端逻辑,不处理静态资源,优化性能

1、静态资源在nginx.conf中的配置,路径可以自定义
未分类
2、在服务器上创建如下目录

sudomkdir –vp /var/www/DataBusines/static/

3、修改目录权限

sudochmod 777 /var/www/DataBusiness/static/

4、项目代码中配置settings,加入该目录(本地演示在IDE中,线上可以用vi)
未分类

5、收集所有静态文件到static_root指定目录

服务器上切换到项目目录(DataBusines),执行如下命令收集

python  manage.py collectstatic

6、查看静态资源目录
未分类

12、更改uwsgi.ini配置

刚才在做uwsgi时候,用了http配置,现在nginx正式搭建起来,需要改成socket配置,修改完毕要重启uwsgi
未分类
Settings.py需要debug设置为不调试,允许访问的地址设置为服务器地址
未分类
以上步骤完成后,访问服务器主机地址和端口,如果nginx.conf中配置的为80端口,则地址栏不需要输入端口,因为浏览器请求端口也是默认为80端口,非80端口的需要自己在ip后面添加
未分类