-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
111 lines (111 loc) · 32 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[通过Docker为MySQL安装phpMyAdmin管理界面]]></title>
<url>%2FHow-to-install-phpMyAdmin-with-Docker-for-your-MySQL.html</url>
<content type="text"><![CDATA[前言 Docker是一个开源的应用容器引擎,它能够实现应用部署的自动化。此外,容器是完全使用沙箱机制,容器之间的环境相互独立,不会相互干扰。 phpMyAdmin能够为你的MySQL提供直观、方便的Web管理界面,非常好用。 在这里,由于我不想让phpMyAdmin的PHP、Apache环境与服务器上原有环境混杂到一起,因此采用Docker+phpMyAdmin的方式。 1. 修改MySQL配置和远程访问一个道理,要想从容器中的phpMyAdmin访问运行在服务器上的MySQL,必须先修改MySQL配置文件,允许非localhost的IP访问。 打开/etc/mysql/mysql.conf.d/mysqld.cnf配置文件,进行如下修改:12345bind-address = localhost# 找到上式,修改为bind-address = xxx.xx.xx.x # 你的docker0的ip地址# 或者修改为bind-address = 0.0.0.0 # 表示允许任意ip地址访问 然后,还需要将你的账号也设置为允许从远程登陆(默认为localhost)。为了完成这一操作,先通过localhost登入mysql,更改mysql数据库里的user表里对应你账号的host项,从localhost改成%。具体操作如下:123456# 使用mysql数据库use mysql;# 将root账号(可替换成其他)的host修改为%update user set host = '%' where user = 'root';# 查看修改结果select host, user from user; 最后,不要忘记重启mysql:sudo service mysql restart 至此,你的MySQL和对应账号已经开放了从Docker容器中访问的权限。 2. 创建phpMyAdmin镜像123456789# PMA_HOST设置为连接的MySQL主机名或ip地址# PMA_PORT设置为端口号# 8080:80,将宿主机的8080端口映射到镜像的80端口docker run -d \ --name myadmin \ -e PMA_HOST=$(ip route show | grep docker0 | awk '{print $9}') \ -e PMA_PORT=3306 \ -p 8080:80 \ phpmyadmin/phpmyadmin 值得一提的是,这里是通过桥接网络模式(bridge mode)运行的镜像,因此在镜像中可通过docker0访问宿主网络。 3. 访问数据库此时,可以通过8080端口访问到phpMyAdmin的管理界面了,即http://your_domain_name:8080/。 4. One More Thing把MySQL随意地暴露在网络下无疑会带来安全隐患,从安全角度考虑,应该为防火墙设置白名单规则,只有白名单的IP才能够连接数据库。12# ufw防火墙,提供一个参考思路而已ufw insert 1 allow from 172.17.0.3 to any port 3306 参考 How to install MySQL and phpMyAdmin with Dockerhttps://blog.thenets.org/how-to-install-mysql-and-phpmyadmin-with-docker/ phpMyAdmin Docker repositoryhttps://hub.docker.com/r/phpmyadmin/phpmyadmin/ From inside of a Docker container, how do I connect to the localhost of the machine?]]></content>
<categories>
<category>服务器搭建</category>
</categories>
<tags>
<tag>Docker</tag>
<tag>MySQL</tag>
<tag>phpMyAdmin</tag>
</tags>
</entry>
<entry>
<title><![CDATA[如何通过uwsgi重载django项目代码]]></title>
<url>%2FHow-to-use-uwsgi-restart-django.html</url>
<content type="text"><![CDATA[写在前面在默认设置下,uwsgi本身不会立即加载修改后的文件,这是为了效率起见。如果你有修改代码后需要立即在服务器上reload的需求,则在uwsgi的ini文件中加入如下修改(不建议):1py-autoreload = 1 如果我们仅仅只是在开发环境调试程序的话,其实使用manage.py就已足够,如下:1python manage.py runserver 0.0.0.0:8000 runserver在检测到文件修改时,会自动重载,对于开发调试已经足够。 正确手动重载uwsgi和代码的方式首先,确保你uwsgi的ini配置文件有自动生成pidfile。1pidfile = /path/to/your/uwsgi.pid 然后,在你的uwsgi.pid的目录下执行:12uwsgi --reload uwsgi.pid#其中uwsgi.pid是我的uwsgi自动生成的文件,即进程的pid文件。 至此,修改后的代码已经被重载,并且生效了。]]></content>
<categories>
<category>服务器搭建</category>
</categories>
<tags>
<tag>Django</tag>
<tag>uwsgi</tag>
</tags>
</entry>
<entry>
<title><![CDATA[如何给Ubuntu正确地设置永久环境变量并立即生效]]></title>
<url>%2FHow-to-set-a-permanent-environment-variable-for-ubuntu-correctly.html</url>
<content type="text"><![CDATA[本文内容如下 什么是环境变量? 哪些文件可以设置环境变量,有什么区别? 如何设置永久环境变量并立即生效? 1. 什么是环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,这些参数会对系统行为产生影响。 比如常用的PATH环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还会到PATH中指定的路径去找。你可以在终端使用printenv PATH查看当前PATH变量的值。 2. 用户环境变量和系统环境变量Ubuntu系统包含两类环境变量:系统环境变量和用户环境变量。系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效。 用户环境变量可存储在以下文件中: ~/.profile ~/.bashrc, ~/.bash_profile, ~/.bash_login 推荐将环境变量保存在~/.profile中,因为无论是通过控制台还是图形界面启动程序时,都会自动执行该文件。而~/.bashrc, ~/.bash_profile, ~/.bash_login这些文件,当通过shell启动程序时,它们也会被加载;但当通过图形界面环境启动程序时,这些文件中的环境变量设置便不可用了。 系统环境变量可存储在以下文件中: /etc/profile /etc/profile.d(它是文件夹) /etc/bash.bashrc /etc/profile和/etc/profile.d都是常用的设置环境的地方。其中/etc/profile.d文件夹来源于/etc/profile,在该目录下的*.sh,即以sh为后缀的文件都会被加载。类似地,不推荐使用/etc/bash.bashrc,因为在图形界面环境下启动程序时,不会加载它里边的环境变量设置。 3. 设置永久环境变量实例(以/etc/profile为例) 12gedit /etc/profile#vim也行 在文件末尾处添加如下,保存并退出: 12 export JAVA_HOME=/usr/lib/jvm/jdk1.7.0export PATH=$PATH:$JAVA_HOME/bin 其中, export命令:使得变量真正输出成为环境变量。 等号=左边为变量名,右边为变量实际值。export后,可以通过$variable_name的形式访问变量,如$JAVA_HOME,即可替换为JAVA_HOME=/usr/lib/jvm/jdk1.7.0。 PATH变量中通常有多个指定路径,中间用冒号隔开。拼接上$PATH变量,则不影响原先的路径设置。 环境变量更改后,在用户下次登陆时生效。如果想立刻生效,则执行下面的语句1source /etc/profile 注意:请在使用时将路径替换为你电脑下的实际路径。如果只是测试,直接复制上面的命令也行,只不过最后会提示“No such file or directory”。 4. 查看环境变量是否已经生效在控制台下输入12$JAVA_HOME$PATH 可以看到,环境变量已经生效了!]]></content>
<categories>
<category>服务器搭建</category>
</categories>
<tags>
<tag>Ubuntu16.04</tag>
<tag>环境变量</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Ubuntu16.04下使用virtualenv创建各版本python的虚拟环境]]></title>
<url>%2FUse-virtualenv-tool-to-create-virtual-environments-for-various-versions-of-python.html</url>
<content type="text"><![CDATA[为什么要使用virtualenv?首先,virtualenv为应用提供了隔离的Python运行环境,可以解决不同应用间多版本的冲突问题。 比如,现在的电脑中一般同时具有python2和python3,系统的运行需要python2,做开发时往往需要更新的python3。而在使用工具pip时,所有第三方的包都会被安装到默认的python(一般是python2)的site-packages目录下,有时这不是我们所希望的。 这正是要用到virtualenv的场合。virtualenv会把用户指定版本的python复制到虚拟环境下,并修改相关的环境变量,使得python和pip命令指向当前虚拟环境。用户可以在虚拟环境中任意操作,而不会对外部造成影响。 1. 安装virtualenv1pip install virtualenv 2. 查看python3目录(其他版本也可)12which python3#我的python3是在/usr/bin/python3 3. 创建python3虚拟环境1virtualenv -p /usr/bin/python3 py3env 其中,-p /usr/bin/python3指定了要复制的python的目录py3env是存放环境的文件夹名称 4. 激活虚拟环境12#使用source命令来使得环境变量修改后立即生效source /root/py3env/bin/activate 可以看到命令提示符有一个(py3env)的前缀,即表示激活成功。此时,你的所有python、pip操作都会指向虚拟环境创建时复制的那一份python。比如再次执行which python,如图。 原来的路径是/usr/bin/python3,激活虚拟环境后是/root/py3env/bin/python。 5.退出虚拟环境1deactivate (py3env)前缀消失,环境变量被重设为原来的。 6. Tip 切记要在工作时激活虚拟环境,结束工作后退出。]]></content>
<categories>
<category>服务器搭建</category>
</categories>
<tags>
<tag>Ubuntu16.04</tag>
<tag>virtualenv</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Ubuntu16.04配置SSH远程免密登陆]]></title>
<url>%2FHow-to-setup-SSH-login-without-a-password.html</url>
<content type="text"><![CDATA[什么是SSH?SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。 1. 安装SSH1sudo apt-get install openssh-server 由于我的Ubuntu服务器已经安装好了SSH,所以提示我无需安装。安装好后,我们需要启动一下SSH服务。 2. 查看并启动SSH1sudo ps -e | grep ssh 其中ps -e表示查看当前的进程,-e表示显示全部,效果同-Agrep ssh即grep match_pattern,是正则表达式,它会获取包含match_pattern的文本段当有类似如上结果显示时,表示服务器的SSH服务正在健壮地运行中。如果没有则需要启动SSH服务,如下:1234#启动ssh服务sudo service ssh start#或者sudo /etc/init.d/ssh restart 3. 查看或修改SSH配置文件SSH的配置文件一般在/etc/ssh/sshd_config中1sudo vim /etc/ssh/sshd_config 老版本的话,可能需要做如下修改才行。如果有PermitRootLogin without-password,加一个”#”号,注释掉该行,并增加一句PermitRootLogin yes。 4. 生成公私钥对12ssh-keygen -t rsa -P ''#-P表示密码password,-P '' 就表示空密码 该命令将在~/.ssh目录下面产生一个密钥id_rsa和一个公钥id_rsa.pubwindows下是当前的用户目录下,比如我的username为echo,所以在C:\Users\echo目录下其中,公钥要复制到服务器上,这样才能在你登录时,进行公私钥配对 5. 将公钥复制到服务器12sudo vim ~/.ssh/authorized_keys#如果没有权限则chmod 600 ~/.ssh/authorized_keys 使用vim编辑器打开.ssh目录下的authorized_keys,并且将本地的id_rsa.pub内容复制进去,如有多个公钥则换行即可,并使用wq命令保存退出。 写在最后由于我使用的是阿里云服务器,在一段时间不操作后,连接就被断掉了……为了更好的使用,可以将断开时间设置为24h。详情见阿里云服务器ssh经常掉线的解决办法。 至此就已经配置好了SSH,请愉快地登录吧!!!]]></content>
<categories>
<category>服务器搭建</category>
</categories>
<tags>
<tag>Ubuntu16.04</tag>
<tag>SSH</tag>
</tags>
</entry>
<entry>
<title><![CDATA[详解django中的collectstatic命令以及STATIC_URL、STATIC_ROOT配置]]></title>
<url>%2FDetails-on-the-collectstatic-command-in-django-as-well-as-the-configuration-of-static-file-directory.html</url>
<content type="text"><![CDATA[前言我最近在琢磨django框架的使用,在上传个人网站服务器上时,再次遇到了找不到静态文件,css、img等样式全无的问题。于是沉下心来,好好研究了django的静态文件到底应该怎么去部署(deploy),一点心得体会现分享于下。 1. python manage.py collectstatic做了什么 Collects the static files into STATIC_ROOT.翻译:把静态文件收集到 STATIC_ROOT中。 以上是官方文档中的简述。 当然你肯定会问,从哪里收集这些静态文件呢? 在回答这个问题前,我们先看一眼自己项目中的setting.py文件:1234567STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static/"), ]STATIC_URL = '/static/'STATIC_ROOT = os.path.join(BASE_DIR, "static_new/")#其中STATIC_ROOT和STATICFILES_DIRS默认为None,#即未设置,我是自己配置成这样子的 python manage.py collectstatic在执行时,django默认会去查看定义在STATICFILES_DIRS里的目录,以及在INSTALLED_APPS里定义了的app的static目录。如果这些目录下有文件,则把文件全部收集起来,拷贝到STATIC_ROOT目录下。[18.10.19二次编辑:当使用django的runserver时,如果请求的是一个静态文件,django也是会默认查看上述的ROOT、DIRS和static目录。但是,在部署到服务器上时,此规则就不使用了。] 这样说可能有点难懂,下面给出一个示例: 首先,以下是我的项目树形图,多余文件在此已被省略。1234567BASE_DIR├── manage.py├── polls│ ├── static│ │ ├── mystie_polls_static.txt├── static│ └── mysite_static.txt 注意:polls是我项目里的一个app!且已经添加到了INSTALLED_APPS中! 可以看到,我的项目下有static/mysite_static.txt以及polls/static/mystie_polls_static.txt,前者目录已经被写在STATICFILES_DIRS中,后者的目录是app下的static目录,均符合静态文件的查找规则。 不难预想到,在执行collectstatic后,mystie_polls_static.txt和mysite_static.txt文件都会被收集到STATIC_ROOT中。 12#在项目目录下执行python manage.py collectstatic 最终项目文件结构的树状图如下:1234567891011├── manage.py├── polls│ ├── static│ │ ├── mystie_polls_static.txt├── static│ └── mysite_static.txt├── static_new│ ├── *admin│ ├── mysite_static.txt│ └── mystie_polls_static.txt#其中,admin是django自带的后台管理的静态文件 不出所料哈哈,django果然方便呀!我们以后很轻松就能把静态文件都收集到一起啦! 2. STATIC_URL的作用 URL to use when referring to static files located in STATIC_ROOT.Example: “/static/“ or “http://www.example.com/static/"翻译:STATIC_URL用于引用STATIC_ROOT所指向的静态文件。 举个栗子,在python manage.py runserver后,我能够以http://localhost:8000/static/mystie_polls_static.txt为路径,访问到STATIC_ROOT下的静态文件。 但是,如果你使用了nginx(或其他)服务器后,该规则就无效了。服务器会接管URL匹配规则,你需要在nginx服务器的配置文件中定义/static的alias。 此外,STATIC_URL还有一个作用,如下: 假定你的设置文件中有1STATIC_URL = '/static/' 那么,在templates中,你可以通过模板标签static和给定的相对路径来构成一个URL,如下。12{% load static %}<img src="{% static "my_app/example.jpg" %}" alt="My image"> 此时,构成的URL为my_app/static/my_app/example.jpg。 如果你在项目中用到了static这个模板标签,那一定要将nginx(或其他)服务器的/static配置到与STATIC_ROOT一致!依我愚见,这样做是有好处的。因为django不像php,只要将静态文件放置在.php或者.html同一目录下就好。比如:<link rel="stylesheet" type="text/css" href="static/css/main.css">,在django中挪进一个文件夹中就可能访问不到了。这个时候static标签就非常有用了;当然你也可以在uwsgi的配置中通过--check-static和--static-map mountpoint=path来解决这个问题。官方链接在此:https://uwsgi-docs.readthedocs.io/en/latest/StaticFiles.html 总结希望本文对大家有所帮助! 笔者也只是一名学生,如果出错了,欢迎指正,也欢迎与我讨论!]]></content>
<categories>
<category>Django框架学习</category>
</categories>
<tags>
<tag>Django</tag>
</tags>
</entry>
<entry>
<title><![CDATA[在django中使用MySQL作为数据库backend(Ubuntu系统)]]></title>
<url>%2FHow-to-use-mysql-as-the-backend-of-django.html</url>
<content type="text"><![CDATA[关于mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。 另外,博主后续也会继续学习MySQL的知识,所以现在就先以MySQL为数据库来使用吧! 1. 安装MySQL(基于Ubuntu)1sudo apt-get install mysql-server mysql-client 试运行MySQL:12#这之后要输入在安装时设置的密码mysql -u root -p 2. 创建一个新数据库及新用户数据库名为1234```shellCREATE DATABASE database_name CHARACTER SET utf8;CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'user_password';GRANT ALL ON database_name.* TO 'user_name'@'localhost'; 1234#查看所有用户SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;#查看所有库SHOW DATABASES; 当然你也可以如下删库、删户,然后跑路 。12DROP USER 'user_name'@'localhost';DROP DATABASE IF EXISTS database_name; 3. 安装MySQL-pythonMySQL-python是python中一个用来链接和管理123```shellsudo apt-get install python3-devpip install mysqlclient 验证是否安装成功,在12345678910```python>>> import MySQLdb>>> db = MySQLdb.connect("localhost", "user_name", "user_password", "database_name")>>> cursor = db.cursor()>>> cursor.execute("SELECT VERSION()")1>>> print(data)('5.7.23-0ubuntu0.16.04.1',)>>> db.close() 如果有出现类似上述响应,则说明安装成功 ,接下来便来到最后一步。 4. 配置django的settings.py1234567891011DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'database_name', # 数据库名 'USER': 'user_name', # 数据库账户名 'PASSWORD': os.environ['MY_DB_PASS'], # 即user_password,数据库密码。 # 为安全起见,应从系统环境变量中获取。os.environ['MY_DB_PASS'] 'HOST': '127.0.0.1', # 数据库服务器IP 'PORT': '3306', # 端口 }} 接下来运行12python manage.py makemigrations # 生成迁移文件,有点prompt的感觉,可以在最终操作前check一下python manage.py migrate #执行迁移 至此,mysql数据库的配置就完成啦。你可以再次查看数据库,此时数据库不为空,因为django已经生成了一些tables在里边了。 Tip可以通过describe table_name查看一个表的结构。]]></content>
<categories>
<category>Django框架学习</category>
</categories>
<tags>
<tag>Django</tag>
</tags>
</entry>
<entry>
<title><![CDATA[正则表达式实用例子]]></title>
<url>%2FUseful-regular-expression-examples.html</url>
<content type="text"><![CDATA[一、正则表达式介绍 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式自成一门语言,它在诸多编程场景中都非常有用,比如: 检测一个前端页面用户输入(电话号码、邮箱等)是否合法 爬虫时对数据进行“匹配”和“过滤”,以获取到我们希望得到的数据 对批量文本的快速替换,免去重复手工操作 二、regex实用例子1. 爬虫时对headers进行包装1^(.*):\s(.*)$ 在mutiline模式下替换为:1"$1": "$2", 效果如下:123456789User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36Accept: image/webp,image/apng,image/*,*/*;q=0.8Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9----------------------------------------------------------------------------"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36","Accept": "image/webp,image/apng,image/*,*/*;q=0.8","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9", 2. C代码去注释在mutiline模式下1(\/\*[\s\S]*?\*\/)|([^:]|^)(\/\/.*$) 3. HTML内容提取4. 电话号码检验下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)1^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ https://regexr.com/]]></content>
<categories>
<category>编程脚手架</category>
</categories>
<tags>
<tag>Regex</tag>
<tag>正则表达式</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Django部署到Nginx阿里云服务器(uwsgi协议)]]></title>
<url>%2FSetting-up-Django-and-your-web-server-with-uWSGI-and-nginx.html</url>
<content type="text"><![CDATA[Django、Nginx、uwsgi各是什么? Django:它是一个开放源代码的Web应用框架,由Python写成。Django是基于Python的web框架中最有代表性的一位。许多成功的网站和APP都基于Django。此外,它的数据库默认设置为SQLite,无需另外安装,除非你要用其他数据库。 Nginx:它是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。优点:轻量,占有内存少,并发能力强。 WSGI(补充):它的全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件。WSGI只是一种规范,描述web server如何与web application通信,在此可理解为描述Nginx服务器与Django项目间的通信。要实现WSGI协议,必须同时实现web server和web application。 uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议。它与mod_wsgi相比的优点为:超快的性能。低内存占用(实测为apache2的mod_wsgi的一半左右)。多app管理。 本文测试环境 云服务器:阿里云Ubuntu16.04 python版本:3.5.2 一、必要软件的安装1. 安装Django1pip install Django 如果你遇到了python2和python3多版本管理的问题,比如pip安装时它没有将Django安装到你所希望的python版本下,可以先读下我的这一篇博文:使用virtualenv创建各版本python的虚拟环境 2. 安装Nginx123sudo apt-get updatesudo apt-get install nginxsudo /etc/init.d/nginx start # start nginx 注意要先执行sudo apt-get update,这条命令是同步 /etc/apt/sources.list 中列出的源的索引文件,相当于获取软件最新的状态,这样才能获取到最新的软件包。不执行update,有可能会提示无法定位到nginx。 安装完成后,用电脑的浏览器访问服务器的公网ip地址,如果出现Nginx的欢迎页面(如下),则表示nginx运行正常。 果然我这里没那么顺利,出现了异常,无法访问到该ip(也许是被墨菲定律眷顾吧= =!)。 因此下边开始异常解决。如果在你的服务器上运行正常,则nginx运行正常,点击跳过异常解决部分。 2.1 nginx无法访问的解决办法问题原因猜测: nginx没有监听80端口 ubuntu服务器的防火墙没有开放80端口 以下将按照这两个猜想进行排查 2.2 查看服务器端口占用1netstat -nap | grep 80 其中:netstat:查看网络系统的状态信息;-a或–all:显示所有连线中的Socket;-n或–numeric:直接使用ip地址,而不通过域名服务器;-p或–programs:显示正在使用Socket的程序识别码和程序名称; 说明nginx确实在监听80端口,运行正常。 2.3 查看防火墙设置12#查看ubuntu的ufw防火墙状态ufw status 结果发现ufw未激活,并没有启用。 了解到阿里云服务器有一个安全组规则设置,其作用可类比防火墙,可以控制端口的开放与关闭。 2.4 阿里云安全组规则配置前往阿里云服务器的管理控制台,点击自己的云服务器–>更多–>网络和安全组–>安全组配置–>配置规则,发现规则里没有对外开放80端口。至此,问题原因已经被找出。 理所当然地,我们应该设置对外开放80端口。选择添加安全组规则,并如下图填写。 其中授权对象的0.0.0.0/0表示允许或拒绝所有的ip访问。我们搭建的个人服务器当然是希望让更多的人访问,因此选择允许所有ip。 配置完成后,再次在浏览器中访问服务器的公网ip,可以看到上述的Welcome to nginx!。 3. 安装uwsgi1sudo pip install uwsgi --upgrade 4. 小结经过上面的步骤,我们已经搭建好了需要的软件和环境。作为web server的nginx也运行良好,现在它只是不知道该如何处理不同的url请求,这就要求我们将nginx、uwsgi、django项目通过配置文件关联起来。 接下来我们就开始逐一配置。 二、进行项目配置1. django项目为了方便测试,我使用的是通过django-admin startproject mysite生成的一个模板项目工程“mysite”。 如果你对django创建app项目还不太了解,这里给出官方教程链接:https://docs.djangoproject.com/en/2.1/intro/tutorial01/ 。如果你对英语感到陌生,不用担心,在官方教程右下角可以将语言切换至中文。 项目工程mysite放置在/var/www目录下,www目录结构如下所示,比如settings.py文件的全路径为/var/www/mysite/mysite/settings.py。123456789101112131415.├── html│ └── index.nginx-debian.html└── mysite ├── *uwsgi.ini ├── *run.log ├── manage.py ├── mysite │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── *static └── *admin#注:带*的表示我们即将要创建的文件 接下来,我们要部署静态文件,即把Django的静态文件(CSS, JavaScript, Images等)收集到一个static文件夹中。这步不需要你手动执行,你只需要打开上述settings.py文件,加入一行:1STATIC_ROOT = os.path.join(BASE_DIR, "static/") 并且1234#找到下面这一行#ALLOWED_HOSTS = []#换成ALLOWED_HOSTS = ['你的公网IP', 'localhost', '127.0.0.1'] 其中你的公网IP请替换成实际的IP地址,这样才能通过公网访问到django应用。 然后执行:12#此命令在外部的mysite文件夹下执行python manage.py collectstatic 接着,你就会发现static文件夹生成好了。 为什么要创建这个static文件夹?为什么我网站的admin后台管理页面样式全没了?你可能已经通过manage.py来运行过django项目,并且访问过默认生成的admin后台管理界面,彼时理所当然是有样式的。如果不创建static文件夹,当使用公网ip访问admin时,客户端将无法获取到django内置的这些静态文件,就会出现样式全无的情况,也就是第二个问题的原因。 2. 配置nginx文件1vim /etc/nginx/sites-available/default 别看这个default文件写了很多东西,其实带#的都是注释,把注释拿开后,我们关注的只有:123456789101112131415161718192021server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name 119.23.69.193; #第一处修改,此处改为你的服务器的公网IP location / { #以下3行是第二处修改 include /etc/nginx/uwsgi_params; #uwsgi_params是我们需要用到的文件 uwsgi_pass 127.0.0.1:8000; #将请求交由uwsgi处理,并传到127.0.0.1:8000 #try_files $uri $uri/ =404; } #####################第三处修改begin location /static { alias /var/www/mysite/static; #请替换成自己实际的静态文件目录 #这里会将请求转换成对alias指定的路径下的文件访问 } #####################第三处修改end} 请把你default文件按如上进行修改,总共有三处,请仔细查看。另外,请不要盲目复制粘贴!对于上述参数,现给出部分参数解释如下: listen 80 default_server;:listen,即监听指令,此处监听80端口,且后面有一个参数 default_server。Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到监听了 default_server 的 节点来处理。 location / {}:表示捕捉server_name的根请求,比如我服务器的根URLhttp://119.23.69.193/ 。同理,/static为http://119.23.69.193/static 。 uwsgi_pass 127.0.0.1:8000;:将请求转至本机的8000端口,不用担心阿里云安全组规则的设置,因为是本地的。 这份配置文件告诉nginx从文件系统里寻找static文件,并且将一些需要django代码介入的行为交由uwsgi来管理。也就是实现了从nginx–>uwsgi。 修改完成后,别忘了重启nginx:1sudo service nginx restart 3. 配置uwsgi文件接下来,在外部的mysite(/var/www/mysite/) 新建一个uwsgi.ini文件和一个run.log文件,即我在www目录结构下提到的带*文件。 然后我们将以下内容添加进这个空的uwsgi.ini文件:12345678[uwsgi]chdir = /var/www/mysitemodule = mysite.wsgisocket = 127.0.0.1:8000 master = true daemonize = /var/www/mysite/run.logdisable-logging = truepythonpath = /root/py3env/lib/python3.5/site-packages chdir:它是你的项目的根目录,请自行替换成你自己的;moudule 是你的入口wsgi模块,将mysite替换成你自己的项目名称;socket 是通信端口设置;master = true 表示以主进程模式运行;daemonize 是你的日志文件目录,这个路径就是刚刚新建的run.log文件的路径;disable-logging = true 表示不记录正常信息,只记录错误信息;pythonpath 是你python的包的路径。由于我们使用了virtualenv环境,所以这里必须设置,请替换成你的实际路径。否则会报错:ImportError:No module named django.core.wsgi。 最后,不要忘记使得ini文件生效:12#在/var/www/mysite/目录下执行uwsgi --ini uwsgi.ini 可以使用uwsgi --python-version命令查看uwsgi对应的python,如果不是virtualenv里的那个版本,请自行修正好。可参考:http://blog.51cto.com/leizhu/2065394123456789#如果要重载init文件,需要如下操作 #查看到占用8000端口的当前的uwsgi netstat -nap | grep 8000#kill掉当前的uwsgi kill -9 进程号#再次运行 uwsgi --ini uwsgi.ini 至此,就完成了nginx–>uwsgi->django项目的配置。其中nginx到uwsgi是通过本地端口8000来完成的,nginx进行转交,uwsgi来监听,最后导入相应的django模块。 写在最后We’re done! 现在,你可以通过ip访问你的网站啦,比如我的:http://119.23.69.193/ 、又或者admin后台管理。 其实还是踩了蛮多坑才能写完这篇博文的哈哈哈哈,希望能对你有帮助呀!有什么问题欢迎留言询问。 我查看了下run.log,发现程序给出了不少调整和优化建议,看来之后要研究下这块,立个flag吧hhh!]]></content>
<categories>
<category>Django框架学习</category>
</categories>
<tags>
<tag>Django</tag>
<tag>uwsgi</tag>
<tag>Nginx</tag>
</tags>
</entry>
</search>