使用阿里云学生版 ECS 服务器套餐预装 ubuntu16.04,阿里云服务器使用 telnet 或者 ssh 进行远程访问如下:
1. 进入自己的阿里云账户控制台,点击安全组,配置安全规则,选择入向,地址段填写 0.0.0.0/0 表示默认全网段访问,端口开放对应的端口 (windows telnet 23 端口,linux ssh 开放 22 端口)
2. 找到公网地址,在命令行输入
ssh username@公网ip -p port
回车后会提示输入密码,输入就行
22 端口被封解决
1. 安全规则开放其他端口
2. 执行一下命令:
cd /etc/ssh/
vi sshd_config
3. 找到类似于 Port 22 的一行(一般在第四行)再其后面添加一行,Port p(p 为你开放的端口)
4. 连接测试
(如果以上仍然未解决,安全规则开放所有端口(当然,只做学习使用),然后连接测试)
ngix 安装
- 新建目录,下载文件方便查找
mkdir /home/nginx_install
cd /home/nginx_install
- 下载 nginx
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
- 安装 nginx 依赖并编译 nginx
apt-get update
apt-get install libpcre3 libpcre3-dev
apt-get install openssl libssl-dev
cd nginx-1.8.1
make
make install
- 测试 nginx 服务是否成功
./sbin/nginx
出现 failed ××80 的情况
fuser -k 80/tcp
./sbin/nginx
nginx 测试
浏览器输入 公网 ip 出现 Welcome to nginx即成功
服务器 mysql 部署
linux 上的 mysql 本来就被纳入了源,直接使用
apt-get install mysql-server-5.7
由于 mysql 为了安全性,只允许本地访问,所以需要登录到 root 用户,然后设置对远程访问授权:
- 允许 root 用户在任何 ip 下访问
grant all privileges on *.* to 'root'@'%' identified by 'yourpassword' with grant option; -- 刷新授权表 flush privileges; -- 退出数据库 exit()
- 只允许 root 用户在一个特定 ip 进行远程登录,并赋予数据库的全部操作权限:
grant all privileges on *.* to 'root'@'远程ip' identified by 'yourpassword'; -- 刷新授权表 flush privileges; -- 退出数据库 exit()
- 允许用户用指定 ip 远程登录,但只赋予所有库特定的权限:
-- 创建一个用户 create user 'username'@'远程主机ip' idenitified by 'yourpassword'; -- 授予该用户权限 grant select,insert,update,delete on *.* to 'username'@'远程主机ip' identified by 'yourpassword' with grant option; -- 刷新权限表 flush privileges; -- 退出 exit()
- 删除用户授权
revoke all on db_name from username; -- 删除用户 delete from user where user='username'; -- 重载授权表 flush privileges; -- 退出 exit()
python 连接远程数据库测试
python 连接数据库可以有多个选择的库,连接 mysql 我喜欢使用 pymysql,连接 sql-server(linux 下 sql-server 的部署不会的可以留言)喜欢用 pymssql,下面介绍 pymysql 的安装 ( 假设已经安装了 anaconda):
pip install pymysql -- 或者 conda install pymysql
然后可以测试:
import pymysql if __name__ == '__main__': conn = pymysql.connect(host = '服务器公网ip',user='用户名',password = '密码',database='数据库名称',charset = 'utf8',port = 3306) cursor = conn.cursor() sql = '''select * from info''' ret = cursor.execute(sql) rs = cursor.fetchall() print(rs)
当然,如果 mysql 的配置没有更改运行此代码会报错ERROR 2003 (HY000): Can’t connect to MySQL server on ‘60.205.221.200’ (111), 解决办法如下:
ubuntu16 以上版本:
cd /etc/mysql vi mysql.conf.d/mysqld.cnf
找到如下两行:
skip-external-locking
bind-address = 127.0.0.1
然后给注释掉,终端输入:
service mysql restart
再次运行上面的测试程序,ok!、
Django 服务器运行
django是python的一个全栈框架,意味这他自带内置服务器,所以并不需要其他的辅助工具来进行运行。
- 将django上传到云主机,由于文件较多,建议压缩上传。进入django项目的父目录,执行
zip -r name.zip name/
name指你的项目名称。然后执行上传命令
scp -p port name.zip username@host:/dir
port是你开放的ssh端口,host是公网ip,dir是你想传到云主机的目录
-
进入晕主机/dir下,运行
ls unzip name.zip cd name/ venv/bin/python manage.py makemigrations venv/bin/python manage.py migration --database=配置的数据库名 venv/bin/python manage.py runserver 0.0.0.0:port &
&表示以守护进程运行,如果要关闭,执行
lsof -i:port #找到pid kill -9 pid
一定要-9,否则杀不掉
-
我的配置如下:
""" Django settings for androidService project. Generated by 'django-admin startproject' using Django 2.2.2. For more information on this file, see https://docs.djangoproject.com/en/2.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/2.2/ref/settings/ """ import os import sys # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps')) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'ey6&eho9zfu*^$p_$tt8u4wx06e6m_*ent_kogp5)06t2ypkx(' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['*'] # AUTH_USER_MODEL = 'login.User' # Application definition INSTALLED_APPS = [ # 'bootstrap_admin', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'apps.login', 'apps.service', 'extra_apps.xadmin', 'crispy_forms', 'reversion', 'extra_apps.DjangoUeditor', 'rest_framework' ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'androidService.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'androidService.wsgi.application' # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '39.106.67.218', 'NAME': 'app', "PASSWORD": '', 'PORT': 3306, 'USER': '', 'TEST': { 'NAME': 'test' } }, 'local': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', 'NAME': 'app', 'USER': '', 'PASSWORD': '', 'PORT': 3306 }, 'private': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Password validation # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/2.2/topics/i18n/ # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-Hans' # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static/'), ) DATABASE_ROUTERS = ['androidService.AutoRouter.AuthRouter'] # TIMEOUT = 300 #过时时间 # VERSION = 1 #版本 # FILE_UPLOAD_MAX_MEMORY_SIZE=2621440#上载在流式传输到文件系统之前的最大大小(以字节为单位 # MEDIA_ROOT = '/home/hui/app/' # 用户上传文件跟目录 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = False # 是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。) EMAIL_USE_SSL = True # 是否使用SSL加密,qq企业邮箱要求使用 EMAIL_HOST = 'smtp.qq.com' # 发送邮件的邮箱 的 SMTP服务器,这里用了163邮箱 EMAIL_PORT = 25 # 发件箱的SMTP服务器端口 EMAIL_HOST_USER = '1593020407@qq.com' # 发送邮件的邮箱地址 EMAIL_HOST_PASSWORD = '*********' # 发送邮件的邮箱密码(这里使用的是授权码) MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')